如何查找正在运行的jar文件的路径

时间:2011-04-16 17:40:30

标签: linux path jar executable-jar

我正在尝试以编程方式查找jar文件运行时的完整路径。我知道还有其他一些问题,但它们似乎都不适合我 - 最值得注意的是,我偶然发现了

MyClass.class.getProtectionDomain().getCodeSource().getLocation().toURI().g­etPath()
好几次。在Eclipse中调试时,这个特定方法对我有用,但是一旦我编译到jar,它就会返回一个NullPointerException。其他方法在编译后遇到了类似的问题。

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

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

任何帮助将不胜感激:)

谢谢!

德里克

编辑:jar是可执行的,如果它改变了什么。

2 个答案:

答案 0 :(得分:2)

你不能这样做。 ClassLoader不要求支持这一点,大多数都不需要。

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

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

如果您控制整个应用程序,则可以执行此操作。

如果你不控制整个应用程序,而是在谈论任意应用程序中任意类加载器中加载的任意jar,你就不能依赖于学习它的位置。

答案 1 :(得分:2)

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

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

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