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

时间:2015-06-19 13:35:35

标签: java xml maven jar

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

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

直到现在:

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

    java -classpath ./conf -jar my-jar-with-dependencies.jar
    
  2. ==>不加载(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>
      
    2. ==&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 */
      

2 个答案:

答案 0 :(得分:2)

使用-jar参数类路径时,将忽略指定的路径。它被指定为here

  

使用此选项时,JAR文件是所有用户类的源,并忽略其他用户类路径设置。

JVM使用manifest中指定的类路径。确保清单包含类路径定义。

答案 1 :(得分:0)

似乎没有一个好的答案。总结:

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

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

$ java -cp <...> MyPackage.MyClass

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