我正在使用maven制作一个swing应用程序,并且我试图将pom.xml保持在紧密的状态(这个文件在粘贴谷歌之后无论如何都会变成一堆垃圾)。
我的pom是jar,我使用带有“jar-with-dependencies”描述符的maven-assembly-plugin。 所以我需要定义两次我的项目部分(主类和版本),一次用于普通的jar,另一次用于jar-with-dependencies。
我认为问题来自jar-with-dependencies程序集描述符,而不是解压缩普通jar并融合清单,它从$ {project.build.outputDirectory}创建一个新的jar,这对我来说很奇怪。< / p>
有没有人有一个紧凑而优雅的想法,以避免重复我的清单配置?
谢谢, 尼古拉斯。
答案 0 :(得分:3)
您可以配置assembly和jar插件以使用[特定清单文件。从程序集文档的创建可执行文件夹部分:
正如您毫无疑问地注意到的那样,Assembly Plugin是一种非常有用的方法,可以为您的项目创建一个独立的二进制工件,以及许多其他内容。但是,一旦你创建了这个自包含的jar,你可能希望能够使用-jar JVM开关来执行它。
为了适应这种情况,Assembly Plugin支持配置与maven-jar-plugin支持的元素相同的元素(请参阅参考资料)。使用此配置,可以轻松配置jar清单的Main-Class属性:
请注意,您定义的清单与生成的内容合并。从引用的jar页面:
您自己的清单文件的内容将与Maven Archiver生成的条目合并。如果您在自己的清单文件中指定一个条目,它将覆盖Maven Archiver生成的值。
以下配置将程序集插件执行绑定到pre-integration-test
阶段(程序包之后的下一阶段),还将包括在src / main / resources / META-INF下定义的MANIFEST.MF。
因此,按照这种方法,您可以在MANIFEST.MF中定义公共清单内容,并将它们合并到最终清单中。
src / main / resources / META-INF / MANIFEST.MF
的内容Created-By: Me
Foo: bar
Main-Class: com.foo.bar.MyMainClass
Bundle-Version: 4.0.0
<强>更新强> 根据有关使用 addDefaultSpecificationEntries 的注释,建议的方法将与jar插件生成的jar上的规范一起使用。但是看起来装配插件还不支持合并其他声明。 jar插件将来自src / main / resources的清单与另外指定的值合并,以在我的测试项目中提供此内容:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Me
Built-By: Rich Seller
Build-Jdk: 1.5.0_15
Specification-Title: Unnamed - org.test:test:jar:1.0.0
Specification-Version: 1.0.0
Implementation-Title: Unnamed - org.test:test:jar:1.0.0
Implementation-Version: 1.0.0
Implementation-Vendor-Id: org.test
Foo: bar
Main-Class: com.foo.bar.MyMainClass
Bundle-Version: 4.0.0
而assembly-plugin的输出是:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Me
Foo: bar
Main-Class: com.foo.bar.MyMainClass
Bundle-Version: 4.0.0
配置:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>jar-with-deps</id>
<phase>pre-integration-test</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifestFile>${manifest.file}</manifestFile>
<!--these properties are ignored-->
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.2</version>
<configuration>
<archive>
<manifestFile>${manifest.file}</manifestFile>
<manifest>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
</manifest>
</archive>
</configuration>
</plugin>
...
<properties>
<manifest.file>src/main/resources/META-INF/MANIFEST.MF</manifest.file>
</properties>