将生成的 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 文件。 我能想到的最简单的事情是:&lt;build&gt;&lt;finalName&gt;WhatEver.jar&lt;/finalName&gt;... 并改成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的主要内容,如果未能解决你的问题,请参考以下文章

maven项目 pom.xml文件解析

MAVEN ECLIPSE JAR工程

maven生成pom文件

请问maven工程jar包,war包,pom打包,都是怎么定的?

如何把jar包生成maven工程

pom文件必须和maven版本一致吗