加载相对于正在执行的 jar 文件的文件
这个问题说明了一切。
在我的情况下,专业是当前工作目录不是jar文件的位置,而是(我的jar文件是由Windows使用右键单击菜单启动的,我想将文件夹的路径作为参数传递给jar)。c:\Windows\system32
现在我想加载一个名为的配置文件,该文件与jar位于同一文件夹中。当然,该文件的目的是为 jar 提供设置。对我来说,重要的是xml文件在jar文件之外,以便于编辑。config.xml
我很难加载该文件。窗口执行该行
cmd /k java -jar D:\pathToJarfile\unpacker-0.0.1-SNAPSHOT-jar-with-dependencies.jar
调用整个事情,使windows命令提示符保持打开状态,以便我可以看到jar的输出。cmd /k
我不能使用 或 作为相对路径,因为这些函数分别返回 和 ,(这是 Windows 执行 AFAIK 的所有内容的工作文件夹)。new File(".")
System.getProperty("user.dir")
C:\Windows\system32\.
C:\Windows\system32
我也没有成功。由于该路径以 开头,搜索从 jar 的根节点开始。将正好指向该文件,但调用将返回 。Launcher.class.getResourceAsStream("/../config.xml")
/
../config.xml
null
有人能给我指出正确的方向吗?我真的被困在这里。这个文件加载的东西真的每次都让我烦恼...
本人要求:
- 我不想在java源代码中对路径进行硬编码
- 我不想将文件的路径作为参数传递给调用(既不作为参数传递给,也不用于设置系统属性)
java -jar
main(String[] args)
-Dpath=d:\...
除了最初的问题之外,在使用时,我很难将maven2放在(BalusC发布的解决方案)中。问题在于,该行出现在常规 jar 的 MANIFEST 文件中,而不是 jar-with-dependencies.jar 的 MANIFEST 文件中(生成了 2 个 jar 文件)。对于任何关心我是如何做到的人:Class-Path: .
MANIFEST.MF
jar-with-dependencies
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<archive>
<manifest>
<mainClass>${mainClass}</mainClass>
<addClasspath>true</addClasspath>
<!--at first, i tried to place the Class-Path entry
right here using <manifestEntries>. see below -->
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<goals>
<goal>attached</goal>
</goals>
<phase>package</phase>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>${mainClass}</mainClass>
</manifest>
<!--this is the correct placement -->
<manifestEntries>
<Class-Path>.</Class-Path>
</manifestEntries>
</archive>
</configuration>
</execution>
</executions>
</plugin>