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 文件的项目:
- Server.jar:这包含所有 类 和资源。一个标准罐子
- Client.jar:这只包含一些外部 类,没有资源。
- ServerSDK.jar:这包含所有 类、资源、测试 类 和其他配置文件。
我决定在一个项目中完成所有三个 jar,因此任何源的更改都会生成 Jenkins 构建并同时部署所有三个。我构建 Server.jar 作为我的标准 pom.xml
jar。然后,我使用程序集构建 Client.jar 和 ServerSDK.jar.
我有构建其他两个 jar 的程序集,一切都是我喜欢的方式的 99%,但我想做一些修改。
- 我们在
MANIFEST.MF
文件中添加了一些条目以合并 Jenkins 构建信息和项目信息。
- 在标准 Maven jar 中,
pom.xml
和 pom.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 的功能。
我有一个生成三个不同 jar 文件的项目:
- Server.jar:这包含所有 类 和资源。一个标准罐子
- Client.jar:这只包含一些外部 类,没有资源。
- ServerSDK.jar:这包含所有 类、资源、测试 类 和其他配置文件。
我决定在一个项目中完成所有三个 jar,因此任何源的更改都会生成 Jenkins 构建并同时部署所有三个。我构建 Server.jar 作为我的标准 pom.xml
jar。然后,我使用程序集构建 Client.jar 和 ServerSDK.jar.
我有构建其他两个 jar 的程序集,一切都是我喜欢的方式的 99%,但我想做一些修改。
- 我们在
MANIFEST.MF
文件中添加了一些条目以合并 Jenkins 构建信息和项目信息。 - 在标准 Maven jar 中,
pom.xml
和pom.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 inMETA-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 的功能。