可运行的jar如何在运行时加载外部xml文件?

gam*_*may 7 java xml jar maven

(这似乎是一个微不足道的问题,但坚持了2天:()

我有一个可运行的jar(用它创建maven assembly plugin).jar中的类在类路径中查找xml文件.但是,我们不希望将jar文件中的xml文件捆绑在一起并希望将其外部化.

试过到现在:

  1. 在运行时设置类路径:

    java -classpath ./conf -jar my-jar-with-dependencies.jar
    
    Run Code Online (Sandbox Code Playgroud)

==>不加载(conf文件夹包含xml)

  1. 在汇编程序插件中设置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>
    
    Run Code Online (Sandbox Code Playgroud)

==>不会将ClassPath添加到runnable jar中的MANIFEST.MF

编辑:

生成MAINFEST.MF在jar中:

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
Run Code Online (Sandbox Code Playgroud)

编辑2:

所以我编辑了MANIFESTjar中生成的并重新创建了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 */
Run Code Online (Sandbox Code Playgroud)

gam*_*may 0

这个问题似乎没有一个好的答案。总之:

  • java -jar忽略-cp选项
  • 添加ClassPathmanifset没有效果(不确定是否是由于库加载 xml 的任何特定方式所致)

因此,唯一有效的选项是手动调用类文件:

$ java -cp <...> MyPackage.MyClass
Run Code Online (Sandbox Code Playgroud)

其中,cp 包含 jar 文件和 conf 文件夹路径。