Maven:一个项目中的三个 Jars。尝试使用程序集,但没有将 pom.xml 和 pom.properties 嵌入到罐子中

Maven: Three Jars in one project. Trying to use an assembly, but not getting pom.xml and pom.properties embedded in the jars

我有一个生成三个不同 jar 文件的项目:

我决定在一个项目中完成所有三个 jar,因此任何源的更改都会生成 Jenkins 构建并同时部署所有三个。我构建 Server.jar 作为我的标准 pom.xml jar。然后,我使用程序集构建 Client.jar 和 ServerSDK.jar.

我有构建其他两个 jar 的程序集,一切都是我喜欢的方式的 99%,但我想做一些修改。

  1. 我们在 MANIFEST.MF 文件中添加了一些条目以合并 Jenkins 构建信息和项目信息。
  2. 在标准 Maven jar 中,pom.xmlpom.properties 嵌入在 META-INF 目录中。

第一个是我通过 maven-assembly-plugin 中的 <assembly> 配置完成的。第二个我似乎无法开始工作,即使我在 <assembly> 配置中将 <addMavenDescriptor> 设置为 true

这是我 pom.xml

中的 maven-assembly-plugin 部分
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <addMavenDescriptor>true</addMavenDescriptor>
            <manifestSections>
                <manifestSection>
                    <name>Build-Information</name>
                    <manifestEntries>
                        <Project-Name>${env.JOB_NAME}</Project-Name>
                        <Build-Number>${env.BUILD_NUMBER}</Build-Number>
                        <SVN-Revision>${env.SVN_REVISION}</SVN-Revision>
                    </manifestEntries>
                </manifestSection>
                <manifestSection>
                    <name>Module-Information</name>
                    <manifestEntries>
                        <Group-ID>${project.groupId}</Group-ID>
                        <Artifact-ID>${project.artifactId}</Artifact-ID>
                        <Version>${project.version}</Version>
                    </manifestEntries>
                </manifestSection>
            </manifestSections>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>Client</id>
            <configuration>
                <finalName>Client</finalName>
                <appendAssemblyId>true</appendAssemblyId>
                <descriptors>
                    <descriptor>src/assembly/client.xml</descriptor>
                </descriptors>
            </configuration>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

<manifestSections> 工作得很好,但是 <addMavenDescriptor> 似乎没有工作,尽管我已经明确地将它设置为 true

根据 maven-archiver-plugin 上的文档:

Whether the created archive will contain these two Maven files:

  • The pom file, located in the archive in META-INF/maven/${groupId}/${artifactId}/pom.xml
  • A pom.properties file, located in the archive in META-INF/maven/${groupId}/${artifactId}/pom.properties

The default value is true.

根据 maven-assembly-plugin 页面:

<archive>
This is a set of instructions to the archive builder, especially for building .jar files. It enables you to specify a Manifest file for the jar, in addition to other options. See Maven Archiver Reference

这里有什么我遗漏的简单的东西吗?

Maven 程序集插件实际上忽略了 addMavenDescriptor 参数,并且永远不会在生成的程序集中包含 Maven 描述符。这可以看出in the source code:只有META-INF/MANIFEST.MF文件可能被添加到JAR存档中。

我找不到关于此的现有 JIRA 问题,所以我继续创建 MASSEMBLY-835 来跟踪此问题。


目前的解决方法是在程序集描述符中自己添加文件:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
  <id>client</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <files>
    <file>
      <source>pom.xml</source>
      <outputDirectory>META-INF/maven/${project.groupId}/${project.artifactId}</outputDirectory>
    </file>
    <file>
      <source>${project.build.directory}/maven-archiver/pom.properties</source>
      <outputDirectory>META-INF/maven/${project.groupId}/${project.artifactId}</outputDirectory>
    </file>
  </files>
  <!-- rest of your configuration -->
</assembly>

这会添加一个 <files> 配置,将 pom.xml 和生成的 pom.properties 添加到目标目录中。

注意pom.properties是由Maven Archiver component during the default package goal into the target/maven-archiver directory生成的;因此,为了在制作程序集时出现它,Assembly Plugin 必须绑定到 package 阶段(或生命周期的后期),并且当前 Maven 项目需要打包 JAR / WAR / EAR / EJB / RAR... 但不是不打包存档的 POM。 Maven 项目的主要工件也需要构建(如果您跳过 JAR 项目的主要 JAR 的生成,则不会生成 pom.properties)。

这适用于大多数情况。但是如果你想要一个万无一失的解决方案,你可以自己创建文件。使用以下内容在项目的某处(例如,基本目录)创建一个 pom.properties

#Generated by Apache Maven ${maven.version}
version=${project.version}
groupId=${project.groupId}
artifactId=${project.artifactId}

在前面的程序集描述符中,改为:

<file>
  <source>pom.properties</source>
  <outputDirectory>META-INF/maven/${project.groupId}/${project.artifactId}</outputDirectory>
  <filtered>true</filtered>
</file>

这将正确替换所创建的 pom.properties 中的占位符,并模仿 Maven Archiver 的功能。