如何为 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 部署脚本完全管理。这就是我最终所做的。