如何为 Bamboo 部署生成具有正确和完整清单文件的附加 jar?
how to generate additional jar which having correct and complete manifest file for Bamboo deployment?
基本上,除了默认的 jar 文件(在我的例子中类似于 <project.name> + <project.version>.jar
)之外,我还想生成一个名为 <project.name>.jar
的 jar 文件。注意:此 <project.name>.jar
与默认 jar 完全相同,但名称不同。
并且这个额外的 jar 应该有一个如下所示的清单文件,这是默认生成的 jar 的清单文件
anifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: XXX
Start-Class: com.XXXX.XXX.Application
Spring-Boot-Version: 1.3.1.RELEASE
Created-By: Apache Maven
Build-Jdk: 1.8.0_74
Main-Class: org.springframework.boot.loader.JarLauncher
我正在如下添加额外的块
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
....
<execution>
<id>copy-jar</id>
<phase>package</phase>
<goals><goal>jar</goal></goals>
<configuration>
<finalName>${project.name}</finalName>
</configuration>
</execution>
<execution>
</plugin>
但在我的例子中,在我的附加 jar 中生成的清单文件没有以下传递字段:
Start-Class
Main-Class
...
所以无法部署。
我知道这个要求听起来很奇怪,但问题很明确,如何让 maven 生成一个具有正确且完整的部署清单文件的 jar?
//完整的插件部分
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals><goal>test-jar</goal></goals>
</execution>
<execution>
<id>copy-jar</id>
<phase>package</phase>
<goals><goal>jar</goal></goals>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</execution>
<execution>
<id>dto-jar</id>
<goals><goal>jar</goal></goals>
<phase>package</phase>
<configuration>
<finalName>${project.artifactId}-dto</finalName>
<includes>
<include>**/dto/*</include>
<include>**/dto</include>
<include>**/exceptions/*</include>
<include>**/exceptions</include>
<include>**/utils/*</include>
<include>**/utils</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
关于您的 maven-jar-plugin
部分:
- 您执行了三项处决:一项针对
test-jar
目标,两项针对 jar
目标
- 其中一个重新使用默认执行 ID (
default-jar
) 来指定 finalName
条目,但未指定任何清单配置。按照这个配置,那么你的manifest文件应该也是空的,与你当时的问题描述不一致。
- 额外的
jar
目标执行有一个带有自定义选项的进一步配置,这里没有错,除了你除了有一个正确填写的清单文件作为它的一部分,而(再次)没有配置为此。
一个可能的解释是,您的 pom 还在其顶部提供了一个 pluginManagement
section, with further configuration for the maven-jar-plugin
, or a parent pom,然后会为其指定进一步的配置。
要仔细检查,您可以 运行
mvn help:effective-pom -Doutput=eff-pom.xml
并检查生成的eff-pom.xml
文件的内容。这将是您案例的唯一真实来源。
查看您的清单条目:
Spring-Boot-Version: 1.3.1.RELEASE
Main-Class: org.springframework.boot.loader.JarLauncher
很明显,您正在处理一个 Spring Boot 项目,通常有一个 Spring Boot parent pom,它已经配置了所需的清单文件。但是,它使用了 fat-jar(具有依赖关系的 jar 或 uber jar), not built via the maven-jar-plugin
but via the maven-assembly-plugin
.
作为 example:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/jar-with-dependencies.xml</descriptor>
</descriptors>
<archive>
<manifest>
<mainClass>org.springframework.boot.loader.JarLauncher</mainClass>
</manifest>
<manifestEntries>
<Start-Class>org.springframework.boot.load.it.jar.EmbeddedJarStarter</Start-Class>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<id>jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
因此,您不应查看 Jar 插件解决方案,而应为此添加进一步的程序集插件执行。
只是快速分享这个问题的其他一些方面。实际上 pom 文件永远不应该负责部署业务(尽管它可以,但很可能在未来带来更多问题)。这部分应该由 bamboo 部署脚本完全管理。这就是我最终所做的。
基本上,除了默认的 jar 文件(在我的例子中类似于 <project.name> + <project.version>.jar
)之外,我还想生成一个名为 <project.name>.jar
的 jar 文件。注意:此 <project.name>.jar
与默认 jar 完全相同,但名称不同。
并且这个额外的 jar 应该有一个如下所示的清单文件,这是默认生成的 jar 的清单文件
anifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: XXX
Start-Class: com.XXXX.XXX.Application
Spring-Boot-Version: 1.3.1.RELEASE
Created-By: Apache Maven
Build-Jdk: 1.8.0_74
Main-Class: org.springframework.boot.loader.JarLauncher
我正在如下添加额外的块
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
....
<execution>
<id>copy-jar</id>
<phase>package</phase>
<goals><goal>jar</goal></goals>
<configuration>
<finalName>${project.name}</finalName>
</configuration>
</execution>
<execution>
</plugin>
但在我的例子中,在我的附加 jar 中生成的清单文件没有以下传递字段:
Start-Class
Main-Class
...
所以无法部署。 我知道这个要求听起来很奇怪,但问题很明确,如何让 maven 生成一个具有正确且完整的部署清单文件的 jar?
//完整的插件部分
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals><goal>test-jar</goal></goals>
</execution>
<execution>
<id>copy-jar</id>
<phase>package</phase>
<goals><goal>jar</goal></goals>
<configuration>
<finalName>${project.artifactId}</finalName>
</configuration>
</execution>
<execution>
<id>dto-jar</id>
<goals><goal>jar</goal></goals>
<phase>package</phase>
<configuration>
<finalName>${project.artifactId}-dto</finalName>
<includes>
<include>**/dto/*</include>
<include>**/dto</include>
<include>**/exceptions/*</include>
<include>**/exceptions</include>
<include>**/utils/*</include>
<include>**/utils</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
关于您的 maven-jar-plugin
部分:
- 您执行了三项处决:一项针对
test-jar
目标,两项针对jar
目标 - 其中一个重新使用默认执行 ID (
default-jar
) 来指定finalName
条目,但未指定任何清单配置。按照这个配置,那么你的manifest文件应该也是空的,与你当时的问题描述不一致。 - 额外的
jar
目标执行有一个带有自定义选项的进一步配置,这里没有错,除了你除了有一个正确填写的清单文件作为它的一部分,而(再次)没有配置为此。
一个可能的解释是,您的 pom 还在其顶部提供了一个 pluginManagement
section, with further configuration for the maven-jar-plugin
, or a parent pom,然后会为其指定进一步的配置。
要仔细检查,您可以 运行
mvn help:effective-pom -Doutput=eff-pom.xml
并检查生成的eff-pom.xml
文件的内容。这将是您案例的唯一真实来源。
查看您的清单条目:
Spring-Boot-Version: 1.3.1.RELEASE Main-Class: org.springframework.boot.loader.JarLauncher
很明显,您正在处理一个 Spring Boot 项目,通常有一个 Spring Boot parent pom,它已经配置了所需的清单文件。但是,它使用了 fat-jar(具有依赖关系的 jar 或 uber jar), not built via the maven-jar-plugin
but via the maven-assembly-plugin
.
作为 example:
<plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.4</version> <configuration> <descriptors> <descriptor>src/main/assembly/jar-with-dependencies.xml</descriptor> </descriptors> <archive> <manifest> <mainClass>org.springframework.boot.loader.JarLauncher</mainClass> </manifest> <manifestEntries> <Start-Class>org.springframework.boot.load.it.jar.EmbeddedJarStarter</Start-Class> </manifestEntries> </archive> </configuration> <executions> <execution> <id>jar-with-dependencies</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
因此,您不应查看 Jar 插件解决方案,而应为此添加进一步的程序集插件执行。
只是快速分享这个问题的其他一些方面。实际上 pom 文件永远不应该负责部署业务(尽管它可以,但很可能在未来带来更多问题)。这部分应该由 bamboo 部署脚本完全管理。这就是我最终所做的。