【问题标题】:Maven: Install external JAR automaticallyMaven:自动安装外部 JAR
【发布时间】:2020-06-17 11:36:31
【问题描述】:

我的项目依赖于oracle jar 来连接到它的数据库。由于它是一个外部jar,我从oracle网站下载它并使用手动安装它

mvn install:install-file -Dfile=ojdbc8.jar -DgroupId=com.oracle -DartifactId=ojdbc8 -Dversion=12.2.0.1 -Dpackaging=jar

在本地运行 maven clean package 运行良好,因为 ojdbc.jar 已安装。

但是,现在我将build 步骤移动到Docker 图像。

from alpine/git as clone
workdir /app
run git clone --single-branch -b master https://github.com/xxxxxxxx

from maven:3.5-jdk-8-alpine
workdir /app
copy --from=0 /app/idot/idot-backend /app
run mvn clean install -T 1C -DskipTests

from openjdk:8-jre-alpine
workdir /app
copy --from=build /app/target/idot-0.0.1-SNAPSHOT.jar /app
cmd ["java -jar idot-0.0.1-SNAPSHOT.jar"]

这一步在build 期间显然失败了,因为外部 jar 不存在。所以为了消除依赖,我编辑了pom.xml 以包含

<repositories>
        <repository>
            <id>local-maven-repo</id>
            <url>file://${project.basedir}/libs</url>
        </repository>
</repositories>

以下的依赖和以前一样

<dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>12.2.0.1</version>
</dependency>

然后我使用以下命令部署 jar 文件

 mvn deploy:deploy-file -Dfile=ojdbc8.jar -DgroupId=com.oracle -DartifactId=ojdbc8 -Dversion=12.2.0.1 -Durl=file:./libs/ -DrepositoryId=local-maven-repo

这将创建一个带有ojdbc8-12.2.0.1.jar 和其他元信息的libs 文件夹。我在github查看这个文件夹

现在,在尝试构建 docker 映像时,它会失败并显示以下错误消息。

... ... . . .

Downloaded from central: https://repo.maven.apache.org/maven2/org/liquibase/liquibase-parent/3.6.3/liquibase-parent-3.6.3.pom (31 kB at 39 kB/s)
Downloading from central: https://repo.maven.apache.org/maven2/com/oracle/ojdbc8/12.2.0.1/ojdbc8-12.2.0.1.pom
[WARNING] The POM for com.oracle:ojdbc8:jar:12.2.0.1 is missing, no dependency information available
Downloading from central: https://repo.maven.apache.org/maven2/org/modelmapper/modelmapper/2.3.2/modelmapper-2.3.2.pom

。 . .

  Downloaded from central: https://repo.maven.apache.org/maven2/org/atteo/evo-inflector/1.2.2/evo-inflector-1.2.2.jar (13 kB at 138 B/s)
Downloading from central: https://repo.maven.apache.org/maven2/com/oracle/ojdbc8/12.2.0.1/ojdbc8-12.2.0.1.jar
Downloading from central: https://repo.maven.apache.org/maven2/org/modelmapper/modelmapper/2.3.2/modelmapper-2.3.2.jar

。 . .

  Downloaded from central: https://repo.maven.apache.org/maven2/com/google/guava/guava/20.0/guava-20.0.jar (2.4 MB at 12 kB/s)
    Downloaded from central: https://repo.maven.apache.org/maven2/io/springfox/springfox-swagger-ui/2.9.2/springfox-swagger-ui-2.9.2.jar (2.9 MB at 14 kB/s)
    Downloaded from central: https://repo.maven.apache.org/maven2/net/bytebuddy/byte-buddy/1.9.12/byte-buddy-1.9.12.jar (3.3 MB at 14 kB/s)
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 07:13 min (Wall Clock)
    [INFO] Finished at: 2020-06-17T11:19:56Z
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal on project idot: Could not resolve dependencies for project com.novartis:idot:jar:0.0.1-SNAPSHOT: Could not find artifact com.oracle:ojdbc8:jar:12.2.0.1 in local-maven-repo (file:///app/libs) -> [Help 1]
    [ERROR]
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR]
    [ERROR] For more information about the errors and possible solutions, please read the following articles:
    [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException
    The command '/bin/sh -c mvn clean install -T 1C -DskipTests' returned a non-zero code: 1

【问题讨论】:

  • 您需要使用 Dockerfile 中的 COPY 语句将 ojdbc jar 复制到您的 mvn 构建路径中。
  • 为什么上面的失败,它在本地工作
  • 它将在本地工作,因为您手动下载了文件(这实际上是 Docker 中的 COPY 步骤)。然后通过 maven install:installfile 使 ojdbc jar 可用于项目。此外,由于您有本地 mvn 存储库设置,该 jar 将在:${project.basedir}/libs 可用。但这是您本地的,如果您也提交了${project.basedir}/libs,这将起作用,我相信情况并非如此。
  • 您需要了解存储库的概念,并且 Docker 构建无法访问您放入 jar 的那个,除非您明确告诉它如何。
  • @Saurabh 如前所述,我也提交了${project.basedir}/libs 文件夹。它显示提交文件夹的错误消息。

标签: java docker maven jar


【解决方案1】:

我在docker 文件中添加了相同的安装命令,而不是所有令人头疼的问题。它现在工作正常。

from alpine/git as clone
workdir /app
run git clone --single-branch -b master https://@github.com/xxxx

from maven:3.5-jdk-8-alpine
workdir /app
copy --from=0 /app/idot/idot-backend /app
run mvn install:install-file -Dfile=/app/ojdbc8.jar -DgroupId=com.oracle -DartifactId=ojdbc8 -Dversion=12.2.0.1 -Dpackaging=jar
run mvn clean install -T 1C -DskipTests

from openjdk:8-jre-alpine
workdir /app
copy --from=build /app/target/idot-0.0.1-SNAPSHOT.jar /app
cmd ["java -jar idot-0.0.1-SNAPSHOT.jar"]

【讨论】:

    【解决方案2】:

    我使用了相同的方法,它对我有用。你可以看这里..

    <dependencies>
        <dependency>
            <groupId>org.java-websocket</groupId>
            <artifactId>Java-WebSocket</artifactId>
            <version>1.4.2-SNAPSHOT</version>
        </dependency>
    </dependencies>
            
    <repositories>
        <repository>
            <id>maven-repository</id>
            <url>file:///${project.basedir}/repo</url>
        </repository>
    </repositories>
    
    mvn deploy:deploy-file -Durl="file:\\\<project-path>\repo" -Dfile=Java-WebSocket-1.4.2-SNAPSHOT.jar -DgroupId=org.java-websocket -DartifactId=Java-WebSocket -Dpackaging=jar -Dversion=1.4.2-SNAPSHOT
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      相关资源
      最近更新 更多