【问题标题】:How to find the path of a running jar file如何找到正在运行的jar文件的路径
【发布时间】:2011-08-06 23:56:02
【问题描述】:

我正在尝试在运行时以编程方式查找 jar 文件的完整路径。我知道还有很多其他问题,但似乎没有一个对我有用 - 最值得注意的是,我偶然发现了

MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().g­etPath()

多次。在 Eclipse 中调试时,该特定方法对我有用,但是一旦我编译为 jar,它就会返回 NullPointerException。其他方法编译后也遇到类似问题。

我有一个使用 java.class.path 的临时解决方法,但是当我从 GUI 执行 jar 时,它只会返回完整路径 - 在终端中,它会失败。

我还应该注意,我遇到此问题的唯一系统是 Linux。在 Windows 和 Mac 上,我没有任何问题。

任何帮助将不胜感激:)

谢谢!

德里克

编辑:jar 是可执行的,如果有任何改变的话。

【问题讨论】:

    标签: linux path jar executable-jar


    【解决方案1】:

    你做不到。类加载器不需要支持这一点,而且大多数都不支持。

    或者,也许这个公式会更有帮助。二进制类通过ClassLoader 对象进入JVM。 ClassLoader 对象不需要跟踪它们加载的类的出处。他们可以从任何地方加载它们:罐子、网络、数据库、旧锡罐。

    因此,如果您想始终了解应用程序中类的出处,则必须始终使用类加载器加载代码,该类加载器确实以对您有用的方式跟踪出处。

    如果您控制整个应用程序,则可以这样做。

    如果您不控制整个应用程序,而是谈论将任意 jar 加载到任意应用程序中的任意类加载器中,您就不能依赖于了解它的位置。

    【讨论】:

    • 非常感谢!很高兴知道这一点。另一个注意事项,以防它改变任何东西 - 我忘了提到这是一个可执行的 jar 文件。
    • 如果您确定这一点,那么系统属性 java.class.path 就是您的朋友。你的班级会在那里。
    【解决方案2】:

    即使从 jar 文件运行,以下内容也适用于我:

    URL url = this.getClass().getProtectionDomain().getCodeSource().getLocation();
    String p = URLDecoder.decode(url.getFile(), "UTF-8");
    File jarFile = new File(p);
    

    通过 URLDecoder 发送路径很重要,否则如果目录包含空格,则会创建包含 %20 的路径名。

    【讨论】:

    • 试过了,但仍然得到 NullPointerException。无论如何,谢谢!
    • 它对我有用,不知道你的设置有什么不同
    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 2012-07-21
    • 2016-10-20
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多