将生成的 jar 文件的名称从 Maven pom.xml 传递到 Dockerfile
Posted
技术标签:
【中文标题】将生成的 jar 文件的名称从 Maven pom.xml 传递到 Dockerfile【英文标题】:passing name of generated jar file from Maven pom.xml to Dockerfile 【发布时间】:2018-02-25 08:15:17 【问题描述】:我有一个我正在尝试转换的 java/hibernate/jpa/maven 项目,以便它(从项目创建的 .jar 文件)是 Docker 映像的一部分。我也在使用 Spotify 插件。
下面,对于下面的 Docker 命令
ADD <full_path_of_generated_file>.jar app.jar
值 full_path_of_generated_file 是从 pom.xml 文件(在 Maven 端)生成的。这些信息是 Docker 正确生成映像所必需的。
如何将生成的文件的名称转移到 Dockerfile 中?
TIA
Maven pom.xml 文件的插件区
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<configuration>
<imageName>apx/$project.artifactId</imageName>
<dockerDirectory>$project.basedir/docker</dockerDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<!-- <version>2.6</version> -->
<executions>
<execution>
<id>analyze</id>
<phase>package</phase>
<configuration>
<failBuild>true</failBuild>
<ignoreDirect>false</ignoreDirect>
</configuration>
</execution>
</executions>
<configuration>
<finalName>$project.artifactId</finalName>
<archive>
<manifest>
<mainClass>ccinfw.MainApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
[... snip ...]
<artifactId>ccinf</artifactId>
下面是正在使用的 Dockerfile 的副本
FROM java:8
VOLUME /tmp
ADD <full_path_of_generated_file>.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
【问题讨论】:
我假设你的 pom 包装是“jar”或者你没有给出包标签? 我只合并了 pom.xml 文件的一部分(为了保持简短)。是的,正在创建一个用于 Docker 映像的 .jar 文件。 我能想到的最简单的事情是:<build><finalName>WhatEver.jar</finalName>...
并改成ADD target/WhatEver.jar app.jar
?
顺便说一句:您在 pom 文件中为 maven-jar-plugin 定义的配置不存在...您也不需要执行任何操作。只给出 mainClass 的配置部分...插件配置中没有 finalName 等。
【参考方案1】:
在 pom.xml 中
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>$basedir/target/</outputDirectory>
<resources>
<resource>
<directory>src/main/docker</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
确保将 Dockerfile 放在 pom 中提到的位置,以便它可以通过动态替换引用来构建和复制 Dockerfile。
Dockerfile 内部
ADD @project.artifactId@-@project.version@.jar app.jar
学分:https://github.com/vmudigal/microservices-sample
【讨论】:
这个学分有ADD service-three.jar app.jar
在他的项目可执行文件ADD @project.artifactId@-@project.version@.jar app.jar
不工作【参考方案2】:
对我有用的是将最终工件的名称(例如 something_or_other-1.2.3-SNAPSHOT.jar)作为参数 (ARG) 传递到 Dockerfile。
在 pom.xml 中:
<plugin>
...
<configuration>
...
<buildArgs>
<JAR_FILE>$project.build.finalName.jar</JAR_FILE>
</buildArgs>
</configuration>
</plugin>
然后,在 Dockerfile 内部
# insert other Dockerfile stuff here and then...
ARG JAR_FILE
ADD target/$JAR_FILE app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]
【讨论】:
以上是关于将生成的 jar 文件的名称从 Maven pom.xml 传递到 Dockerfile的主要内容,如果未能解决你的问题,请参考以下文章