2013-05-07 106 views
2

我需要将应用程序打包为可执行的jar文件;其属性文件将位于其外部,位于同一目录中。最后,我将有类似的东西在文件系统:如何从Maven生成的jar-dependent-dependencies中排除INDEX.LIST?

 
. 
app.jar 
file1.properties 
file2.properties 

但是,它的包装后,该应用程序不能访问属性文件。经过一番调查后,我想我知道是什么原因造成的,但我无法指示Maven按我的意愿去演出。

我使用Maven的组装插件来构建一个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类,我把下面的代码,就从罐子外面测试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文件夹中找到它。我从jar中删除它并再次执行它;结果是:

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

回答

1

我放弃了使用maven组装的插件。

相反,我用André Aronsen's solution,只是加入如下代码:

<manifestEntries> 
    <Class-Path>.</Class-Path> 
</manifestEntries> 

我这样做是为了插入瓶子的当前目录中的类路径中,所以我可以有我的属性文件外面,因为我想要的。

只是为了未来的读者着想,这里是最后的代码:

<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> 

这样,我没有与很多问题的后顾之忧,并在在Sametime安德烈Aronsen的解决方案很简单,尽管它并没有在其内部创建一个具有所有依赖项的jar。

感谢您的阅读,AndréAronsen的荣誉,并希望这对他人也有帮助。

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>