如何在桌面应用程序的</manifest>中的pom.xml中只配置一次<manifest>

时间:2009-09-14 12:31:03

标签: java maven-2 maven-plugin

我正在使用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>

有没有人有一个紧凑而优雅的想法,以避免重复我的清单配置?

谢谢, 尼古拉斯。

1 个答案:

答案 0 :(得分:3)

您可以配置assemblyjar插件以使用[特定清单文件。从程序集文档的创建可执行文件夹部分:

  

正如您毫无疑问地注意到的那样,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>