(这似乎是一个微不足道的问题,但坚持了2天:()
我有一个可运行的jar(使用maven assembly plugin
创建)。 jar中的类在类路径中查找xml文件。但是,我们不希望将jar文件捆绑在jar中,并希望将其外部化。
直到现在:
在运行时设置类路径:
java -classpath ./conf -jar my-jar-with-dependencies.jar
==>不加载(conf文件夹包含xml)
在汇编程序插件中设置classpath
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<mainClass>com.xxx.Test</mainClass>
<addClasspath>true</addClasspath>
<classpathPrefix>./conf/</classpathPrefix>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
==&GT;不会将ClassPath添加到runnable jar中的MANIFEST.MF
修改
在jar中生成MAINFEST.MF
:
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: xxx
Build-Jdk: 1.7.0_21
Main-Class: com.xxx.Test
编辑2 :
所以我在jar中编辑了生成的MANIFEST
并重新创建了jar。仍然没有找到xml!
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: xxx
Build-Jdk: 1.7.0_21
Main-Class: com.xxx.Test
Class-Path: . /* Tried with both . and ./conf */
答案 0 :(得分:2)
使用-jar
参数类路径时,将忽略指定的路径。它被指定为here
使用此选项时,JAR文件是所有用户类的源,并忽略其他用户类路径设置。
JVM使用manifest中指定的类路径。确保清单包含类路径定义。
答案 1 :(得分:0)
似乎没有一个好的答案。总结:
java -jar
忽略-cp
选项ClassPath
添加到manifset
也没有任何效果(不确定是否是由于库如何加载xml的任何特定方式)因此,唯一有效的选项是手动调用类文件:
$ java -cp <...> MyPackage.MyClass
其中,cp包含jar文件和conf文件夹路径。