Spring Boot 控制目标 JAR 文件名

Posted

技术标签:

【中文标题】Spring Boot 控制目标 JAR 文件名【英文标题】:Spring Boot control target JAR file name 【发布时间】:2016-10-08 11:37:00 【问题描述】:

我的 Spring Boot 项目有构建描述:

<build>

    <plugins>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.18.1</version>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.18.1</version>
                </dependency>
            </dependencies>
        </plugin>

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>$spring-boot.version</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>com.app.MainClass</mainClass>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>

    </plugins>
</build>

我希望我的 JAR 文件名在一个分支中为 app-1.0-SNAPSHOT.jar,在另一个分支中为 1.0-RELEASE.jar,由 Jenkins 控制(使用某种 mvn 设置或 JVM 参数,例如 -D..

我可以这样做吗?

【问题讨论】:

在您的第二个分支中,pom.xml 已经将version 设置为1.0-RELEASE?如果是这种情况,那么一切都可以开箱即用,但问题是:您如何处理发布和分支?你在用maven-release-plugin吗?您正在使用哪个版本控制以及哪个分支策略(即 git、gitflow)? 我在 spring boot 父级中没有看到任何特殊设置。所以 jar 名称是从 build.finalName 派生的:$project.artifactId-$project.version。您可以重新配置将分支属性添加到其中 【参考方案1】:

如此简单,在一个分支中,您拥有pom.xml

<build>
  <finalName>app-1.0-SNAPSHOT</finalName>
</build>

在其他分支中,您有 pom.xml

<build>
  <finalName>1.0-RELEASE</finalName>
</build>

【讨论】:

【参考方案2】:

您可以像这样将项目的版本传播到您的构建名称:

<build>
    <finalName>app-$project.version</finalName>
</build>

或者你的父项目的版本,如果你有的话:

<build>
    <finalName>app-$parent.version</finalName>
</build>

然后您将跟踪您的项目版本而不是构建名称。

但是,请注意,在 SCM 中使用分支管理构建版本是一件令人头疼的事情,而且容易出错。建议您的代码存储库与您的构建版本无关。

一种可能的替代方法是使用一些发布管理工具,例如maven release plugin,或者更简单的maven version

示例:

这里我将给出使用maven verion的例子。

假设您正在使用 SCM 工具(可能是 git)和构建工厂(如 Jenkins 或任何其他工具)。假设您有一份工作来构建和部署快照,而另一份工作则用于发布

snapshot 作业中,您可以使用以下 maven 目标设置预构建任务:

versions:set -DnewVersion=app-1.0-SNAPSHOT

以及发布作业中的以下内容:

versions:set -DnewVersion=app-1.0-RELEASE

现在这样做没问题,因为您只是在本地进行,无需在代码中管理构建版本。

现在,您可以在应用maven version 并成功构建(希望包括单元、集成和功能测试)后标记您的(发布)版本。通过这种方式,您可以准确跟踪每个版本中部署的代码。

提示!!空间就是金钱!帮自己一个忙:定期清理快照存储库。创建一个每隔一段时间就会这样做的工作应该不难。

【讨论】:

【参考方案3】:

您可以使用 maven 引导插件指定 artefact-name:

在这种情况下,它将是NewJarName.jar

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>repackage</id>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <finalName>NewJarName</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>

【讨论】:

您忘记将/ 添加到第二个&lt;finalName&gt;

以上是关于Spring Boot 控制目标 JAR 文件名的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.0 Intellij Idea 中图文详解打包成可执行Jar

Spring Boot如何读取jar外的属性文件

使用 Spring Boot Maven 插件时,jar 文件中缺少 Spring Boot 应用程序中的资源

Spring boot项目以jar包形式启动中文乱码

Spring boot jar包加密(防止放在客户端反编译),XJar加密

从 jar 运行时 CSS 未在 Spring Boot 中加载