gpt4 book ai didi

java - 加载相对于正在执行的 jar 文件的文件

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:58 24 4
gpt4 key购买 nike

问题说明了一切。

我的例子的特点是当前工作目录不是 jar 文件的位置,而是 c:\Windows\system32(我的 jar 文件是由 windows 使用右键单击启动的 -菜单,我想将文件夹的路径作为参数传递给 jar)。

现在我想加载一个名为 config.xml 的配置文件,该文件位于与 jar 相同的文件夹中。该文件的目的当然是为 jar 提供设置。 xml 文件位于 jar 文件的外部以便于编辑,这对我来说很重要。

我很难加载该文件。 Windows 执行行

cmd /k java -jar D:\pathToJarfile\unpacker-0.0.1-SNAPSHOT-jar-with-dependencies.jar

使用 cmd/k 调用整个程序会使 Windows 命令提示符保持打开状态,以便我可以看到 jar 的输出。

我不能使用 new File(".")System.getProperty("user.dir") 作为相对路径,因为这些函数返回 C :\Windows\system32\.C:\Windows\system32(这是 Windows 执行 AFAIK 的所有内容的工作文件夹)。

我也没有成功使用 Launcher.class.getResourceAsStream("/../config.xml")。由于该路径以 / 开头,因此搜索从 jar 的根节点开始。转到 ../config.xml 恰好指向该文件,但调用返回 null

有人能指出我正确的方向吗?我真的被困在这里了。这个文件加载的东西每次都让我很烦......

本人要求:

  • 我不想在 java 源代码中硬编码路径
  • 我不想将文件路径作为参数传递给 java -jar 调用(既不作为参数传递给 main(String[] args)也不使用 -Dpath=d:\... 来设置系统属性)

除了原来的问题,我很难让 maven2 将 Class-Path: . 放入 MANIFEST.MF(BalusC 发布的解决方案)使用 jar-with-dependencies 时。问题是该行出现在常规 jar 的 MANIFEST 文件中,但没有出现在 jar-with-dependencies.jar 的 MANIFEST 文件中(生成了 2 个 jar 文件)。对于任何关心我是如何做到的人:

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

最佳答案

这是一种可能的解决方案,使用 Class.getProtectionDomain() :

final Class<?> referenceClass = YourMainClass.class;
final URL url =
referenceClass.getProtectionDomain().getCodeSource().getLocation();

try{
final File jarPath = new File(url.toURI()).getParentFile();
System.out.println(jarPath); // this is the path you want
} catch(final URISyntaxException e){
// etc.
}

YourMainClass 可以替换为您的 jar 中的任何类。


来自Class.getProtectionDomain()文档:

Returns the ProtectionDomain of this class.
If there is a security manager installed, this method first calls
the security manager's checkPermission method with a
RuntimePermission("getProtectionDomain") permission to ensure it's
ok to get the ProtectionDomain.

Returns:
the ProtectionDomain of this class
Throws:
SecurityException - if a security manager exists and its
checkPermission method doesn't allow getting the ProtectionDomain.

关于java - 加载相对于正在执行的 jar 文件的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3627426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com