【发布时间】:2015-09-05 12:29:29
【问题描述】:
(这似乎是一个微不足道的问题,但卡住了 2 天 :( )
我有一个可运行的 jar(使用 maven assembly plugin 创建)。 jar 中的类在类路径中查找 xml 文件。但是,我们不希望将 xml 文件捆绑在 jar 中并希望将其外部化。
尝试到现在:
-
在运行时设置类路径:
java -classpath ./conf -jar my-jar-with-dependencies.jar
==> 不加载(conf 文件夹包含 xml)
-
在汇编插件中设置类路径
<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。还是没找到…… -
主类是否出现在清单中?