【问题标题】:How can a runnable jar load external xml file at runtime?可运行的 jar 如何在运行时加载外部 xml 文件?
【发布时间】:2015-09-05 12:29:29
【问题描述】:

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

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

尝试到现在:

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

    java -classpath ./conf -jar my-jar-with-dependencies.jar
    

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

  1. 在汇编插件中设置类路径

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

==> 不会将 ClassPath 添加到可运行 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 */

【问题讨论】:

  • 你可以这样使用:InputStream stream1 = getClass().getResourceAsStream("/path/resource.xml");或 InputStream stream2 = getClass().getResourceAsStream("path/resource.xml");加载外部资源
  • 加载 xml 的代码位于外部库中(它也与组装的 jar 捆绑在一起)。我无权访问该代码。它只是在运行时在类路径上查找 xml。我要做的就是确保该库找到 xml - 尽管来自外部文件夹而不是捆绑在 jar 中。对于 xml 物理所在的库来说,这应该无关紧要。
  • 你的 jar 所在的位置必须在类路径上。你能不能把它放在同一个位置(作为你的 jar 文件)?
  • 我试过了 - 将 xml 放在与 jar 相同的文件夹中,然后从该文件夹运行 java -jar。还是没找到……
  • 主类是否出现在清单中?

标签: java xml maven jar


【解决方案1】:

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

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

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

【讨论】:

  • -jar 选项忽略 -classpath 的任何引用?我尝试在我的问题中添加classpath 和第二个选项。看起来我可能错过了汇编插件配置的一些内容。
  • 添加了答案第一部分的证明。
【解决方案2】:

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

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

因此,唯一可行的选择是手动调用类文件:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 2010-09-16
    • 1970-01-01
    • 2018-02-23
    • 2014-07-30
    • 2022-01-01
    • 2011-11-26
    • 2017-01-30
    相关资源
    最近更新 更多