如何从maven生成的jar-with-dependencies中排除INDEX.LIST?

时间:2013-05-07 23:18:01

标签: maven jar

我需要将应用程序打包为可执行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

2 个答案:

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