Maven – 我怎样才能添加一个任意的类path条目到一个jar?

我有一个不寻常的情况,我需要添加一个任意的类path条目(指向一个jar文件)到可执行jar的清单。 (这是一个Swing桌面应用程序。)

maven-jar-plugin使用maven依赖关系为jar清单生成“Class-Path”条目,似乎没有任何添加任意条目的方法。

我也使用“-classpath”参数将任意类path条目硬编码到启动应用程序的batch file中,但我无法弄清楚如何让Maven将类path过滤到batch file中。

我发现这个问题有一个简单的解决scheme。 您可以将<Class-Path>元素添加到<manifestEntries>元素,并将<addClassPath>true</addClassPath><manifest>元素。 所以<Class-Path>元素的值自动添加到class-path中。 例:

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> <addClasspath>true</addClasspath> <mainClass>your.main.Class</mainClass> </manifest> <manifestEntries> <Class-Path>../conf/</Class-Path> </manifestEntries> </archive> </configuration> </plugin> 

更新:以下是如何将类path过滤到自定义清单。

maven-dependency-plugin的build-classpath目标可以被configuration为以属性格式(即classpath = [classpath])将类path输出到文件。 然后,将filters元素configuration为使用生成的类path文件,并configuration要过滤的资源目录。

例如:

 <build> <plugins> <plugin> <artifactId>maven-dependency-plugin</artifactId> <version>2.1</version> <executions> <execution> <phase>generate-resources</phase> <goals> <goal>build-classpath</goal> </goals> </execution> </executions> <configuration> <outputFilterFile>true</outputFilterFile> <outputFile>${project.build.directory}/classpath.properties</outputFile> </configuration> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifestFile> ${project.build.outputDirectory}/META-INF/MANIFEST.MF </manifestFile> </archive> </configuration> </plugin> </plugins> <filters> <filter>${project.build.directory}/classpath.properties</filter> </filters> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build> 

然后在src / main / resources / META-INF / Manifest.MF中指定以下内容:

 Bundle-Version: 4.0.0 ... Classpath: ${classpath};[specify additional entries here] 

注意:这个处理使用标准窗口path分隔符( \ )有一个错误,生成path被剥离分隔符(注意它在Linux上正常工作)。 您可以通过在build-classpath目标的configuration中指定<fileSeparator>\\\\</fileSeparator>来为Windows正确生成build-classpath


您可以在jar-plugin的configuration中自定义清单。 要做到这一点,你会添加这样的东西给你的POM。

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> ... <configuration> <archive> <index>true</index> <manifest> <addClasspath>true</addClasspath> </manifest> <manifestEntries> <mode>development</mode> <url>${pom.url}</url> <key>value</key> </manifestEntries> </archive> </configuration> ... </plugin> 

完整的归档器规范提供了不lessselect。 有关configuration类path的选项,请参阅示例页面 。

如果这些都不适合你,你可以定义你自己的Manifest ,设置包含所需条目的属性,并使用一个filter来填充具有这些属性的清单

尝试像在这个bug中那样做,即使用manifestEntries / Class-Path元素合并条目

http://jira.codehaus.org/browse/MJAR-41