我需要将应用程序打包为可执行jar;它的属性文件将位于同一目录之外。最后,我将在文件系统中有类似的东西:
. app.jar file1.properties file2.properties
但是,打包后,应用程序无法访问属性文件。经过一些研究,我想我知道是什么导致它,但我无法指示Maven按我的意愿执行。
我正在使用maven-assembly-plugin构建一个带有依赖关系的jar,如下所示:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<index>false</index>
<manifest>
<mainClass>main.Main</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
当我尝试运行jar时,我得到一个异常,指示jar文件外的属性没有被加载。
在main.Main类中,我输入以下代码,只是为了从jar外部测试accessibiliy:
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL systemResource = ClassLoader.getSystemResource("file1.properties");
System.out.println("File 1 " + systemResource);
systemResource = ClassLoader.getSystemResource("insideJarFile.xml");
System.out.println("insideJarFile.xml " + systemResource);
insideJarFile.xml
是一个打包在jar中的文件。这是上面代码的结果:
File 1 null
insideJarFile.xml jar:file:/D:/test/application-jar-with-dependencies.jar!/insideJarFile.xml
研究几个小时暗示我的原因可能是INDEX.LIST文件。我用7-zip打开了jar文件,然后在META-INF文件夹里面找到了它。我从罐子里面删除它并再次执行它;结果是:
File 1 file:/D:/test/file1.properties
insideJarFile.xml jar:file:/D:/test/application-jar-with-dependencies.jar!/insideJarFile.xml
问题:我如何告诉maven不创建INDEX.LIST文件?我试过了<index>false</index>
,但它没有用。
TIA,
FQL
答案 0 :(得分:1)
我放弃了使用maven-assembly-plugin。
相反,我使用了André Aronsen's solution,只添加了以下代码:
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
我这样做是为了在类路径中插入jar的当前目录,所以我可以将我的属性文件放在它之外,就像我想要的那样。
为了未来的读者,这里是最终的代码:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>theMainClass</mainClass>
</manifest>
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
这样,我不必担心很多问题,同时AndréAronsen的解决方案非常简单,虽然它没有创建一个包含所有依赖关系的jar。
感谢阅读,感谢AndréAronsen,并希望这也有助于其他人。
答案 1 :(得分:1)
另一种解决方法是在jar创建后删除Index.List文件。这可以在TrueZIP Maven Plugin的帮助下完成。这样就不必切换maven-assembly-plugin了。
以下示例摘自here。只需在maven-assembly-plugin之后将代码段插入pom.xml。
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>truezip-maven-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
<id>remove-a-file-in-sub-archive</id>
<goals>
<goal>remove</goal>
</goals>
<phase>package</phase>
<configuration>
<fileset>
<directory>target/my-jar.jar/META-INF</directory>
<includes>
<include>INDEX.LIST</include>
</includes>
</fileset>
</configuration>
</execution>
</executions>