【问题标题】:How to get the absolute path of the executed jar?如何获取执行jar的绝对路径?
【发布时间】:2015-09-16 13:53:48
【问题描述】:

如何获取已执行 jar 的位置?我找到了很多解决方案,但没有一个对我有用。当我在我的 IDE 中运行它们时,一切都很好。一旦我构建了一个 jar 文件并使用java -jar myapp.jar 运行它,输出就像/.../myapp.jar!/foo/bar

我将在 myapp.jar 中运行代码 - 而不是在任何库中。

罐子的位置:/home/me/dev/myapp/myapp.jar
预期输出:/home/me/dev/myapp/

我不想要 System.getProperty("user.dir"); 那样的工作目录

我为什么要这样做:

我想在实际的 jar 旁边存储和加载一个文件。喜欢

/home/me/bin/myapp/myapp.jar
/home/me/bin/myapp/license.key

我想避免将文件存储到像System.getProperty("user.home"); 这样的通用文件夹中。而且我不想将文件存储在 jar 文件中。

【问题讨论】:

  • @flafoux 这些解决方案都没有达到我的预期输出。
  • 这里最重要的问题是:为什么需要这些信息?通常,不需要知道任何 JAR 文件的位置。其实这个问题好像是XY problem
  • @Seelenvirtuose 更新了我的问题
  • @Brettetete:您是否将所需的库打包到可执行 jar 中?

标签: java maven jar


【解决方案1】:

java.nio.file.Paths.get(".").toAbsolutePath() 将返回当前目录的绝对路径。

【讨论】:

  • 我在这里引用我的问题:“我不想要工作目录”
  • 尝试创建简单的类,将Paths.get(".").toAbsolutePath() 打印到标准输出并创建包含此类的 jar 文件。然后将此 jar 文件移动到不同的文件夹并运行java -jar test.jar。我看到 jar 文件所在的目录名称打印到标准输出。我以为这就是你想要的。
  • cd /tmp && java -jar /home/me/myapp.jar 会导致/tmp/ - 这不是我想要的。我要/home/me/
【解决方案2】:

我使用这些方面的东西:

[YourClass].class.getProtectionDomain().getCodeSource().getLocation().getPath()

问候

【讨论】:

  • 给我以下结果file:/home/me/myapp/myapp.jar!/META-INF/classes!/
  • 我正在获取文件:/home/me/myapp/myapp.jar 你使用的是什么 JRE,你是如何打包 jar 的?
猜你喜欢
  • 2013-06-26
  • 1970-01-01
  • 2010-09-21
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多