错误:找不到或加载主类org.h2.tools.RunScript

时间:2019-06-27 14:10:40

标签: database docker h2

enter code here我将我的Web应用程序和h2database作为docker容器。我已经全部设置了docker compose yml文件。现在,我需要初始化此数据库(h2database)。但是我做不到。当我进入h2database docker容器时,我在此initdb.sh中看到docker-entrypoint-initdb.d / initdb.sh,我已添加了脚本

#!/bin/bash
java -cp  h2-1.4.190.jar org.h2.tools.RunScript \
          -script /App1/BasePl/sql-scripts/h2/common-scripts/BasePl-schema-h2.sql \ -url "jdbc:h2:http://localhost/code1/Demo2./BasePl"

但是当我尝试使用bash命令执行此initdb.sh时,它给我错误:无法找到或加载主类org.h2.tools.RunScript

我尝试了所有可能的类路径组合,还下载了不同的h2 jarfiles zip文件夹,还检查了h2 \ src \ main \ org \ h2 \ tools下的RunScript文件及其位置。所以我不明白这里是什么问题。

Error: Could not find or load main class org.h2.tools.RunScript

我的Docker-compose.yml文件:

version: '3'
services:
  baseplapplication:
    build:
      context: .
      dockerfile: Dockerfile
    environment:
        BASEPL_HOME: "/usr/local/BASEPL"  

    ports:
      - "882:8080"
    volumes: 
      - basepl_data:/var/bio
    depends_on:
      - db
    links:
      - db
  db:
    image: "buildo/h2database"

    volumes:
      - ./dumps/init.sh:/docker-entrypoint-initdb.d/initdb.sh    
      - h2data:/var/lib/h2database

    ports:
      - "8082:8082"
volumes:
        basepl_data:
        h2data:

现在当我运行docker-compose命令时将创建initdb,因此我需要进入database(db)容器到initdb.sh的位置,然后将我的脚本#!/ bin / bash java -cp h2-1.4.190.jar org.h2.tools.RunScript \           -script /App1/BasePl/sql-scripts/h2/common-scripts/BasePl-schema-h2.sql \ -url“ jdbc:h2:http://localhost/code1/Demo2./BasePl”。然后,我该如何将位于桌面上的h2-1.4.190.jar文件放到database(db)容器内的该位置。我想要的是通过在docker compose期间针对它运行脚本来填充(初始化)docker数据库。请我是Docker的新手,请帮助我

1 个答案:

答案 0 :(得分:0)

此错误表示Java找不到h2-1.4.190.jar

首先,您需要将h2-1.4.190.jar放在initdb.sh的同一文件夹中,即您的情况下为docker-entrypoint-initdb.d。然后,在您的Dockerfile中,我猜不是WORKDIR的{​​{1}}。

然后,当执行docker-entrypoint-initdb.d时,它打算在java -cp h2-1.4.190.jar中而不是在WORKDIR中找到jar。例如。如果docker-entrypoint-initdb.dWORKDIR,则它将尝试在/root/中找到h2-1.4.190.jar,而不是在存储脚本的文件夹中找到,因此找不到该jar。

要解决此问题,您可以在dockerfile中更改/root,或仅在WORKDIR旁边添加:

init.db.sh

#!/bin/bash dir=$(dirname "$0") java -cp "$dir/h2-1.4.190.jar" org.h2.tools.RunScript \ -script /App1/BasePl/sql-scripts/h2/common-scripts/BasePl-schema-h2.sql \ -url "jdbc:h2:http://localhost/code1/Demo2./BasePl" 将确保它与当前正在运行的脚本位于同一文件夹,而不是在其中启动脚本的文件夹。

此外,您可以为dir=$(dirname "$0")使用绝对目录,也可以。