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元素合并条目