【问题标题】:How to get the path of running java program [duplicate]如何获取运行java程序的路径[重复]
【发布时间】:2013-07-06 15:06:52
【问题描述】:

有没有办法获取正在运行的java程序的主类路径。

结构是

D:/
|---Project
       |------bin
       |------src

我想得到D:\Project\bin\的路径。

我试过System.getProperty("java.class.path");,但问题是,如果我像这样跑

java -classpath D:\Project\bin;D:\Project\src\  Main

Output 
Getting : D:\Project\bin;D:\Project\src\
Want    : D:\Project\bin

有什么办法吗?



===== 编辑 =====

在此处获得解决方案

Solution 1Jon Skeet

package foo;

public class Test
{
    public static void main(String[] args)
    {
        ClassLoader loader = Test.class.getClassLoader();
        System.out.println(loader.getResource("foo/Test.class"));
    }
}

打印出来的:

file:/C:/Users/Jon/Test/foo/Test.class


Solution 2(由Erickson

URL main = Main.class.getResource("Main.class");
if (!"file".equalsIgnoreCase(main.getProtocol()))
  throw new IllegalStateException("Main class is not stored in a file.");
File path = new File(main.getPath());

请注意,大多数类文件都组装成 JAR 文件,因此这并非在所有情况下都有效(因此是 IllegalStateException)。但是,您可以使用此技术定位包含该类的 JAR,并且您可以通过调用 getResourceAsStream() 代替 getResource() 来获取类文件的内容,无论该类是否在文件系统或 JAR 中。

【问题讨论】:

  • 好吧,您总是可以对结果进行标记(切掉分隔条目的“;”)。类路径属性通常包含几个条目(例如您正在使用的库等)。也许你应该重新考虑你的要求。如果您只对一个文件夹感兴趣,您确定解析类路径是个好主意吗?
  • @Matthias 请注意路径分隔符在不同平台上是不同的。最好使用System.getProperty("path.separator");
  • 一如既往地处理这类问题。 为什么?您要实现什么实际的应用程序功能?设置序列化,“自我卸载程序”..?
  • @AndrewThompson :实际上代码正在使用目录中的一些文件。但是,如果我使用“../..”,那么位于不同目录中的一个/两个 ant 构建会失败。通过在运行时获取路径,解决了这个问题。请告诉是否有任何简单的方法可以防止这种情况发生。

标签: java


【解决方案1】:

使用

System.getProperty("java.class.path")

http://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html

您也可以轻松地将其拆分为元素

String classpath = System.getProperty("java.class.path");
String[] classpathEntries = classpath.split(File.pathSeparator);

【讨论】:

  • 老实说,我不明白这如何回答这个问题。系统属性“java.class.path”返回整个类路径、JAR 和所有内容。 OP 正在询问正在运行的主类(工作目录)的路径。
  • 工作目录不一定是运行类文件的位置。 OP给出的例子证明了这一点。虽然这个答案确实包括了项目组件的所有位置,但他展示了如何将它们分成它们的元素。
  • @monzonj 我同意你的看法。这个问题在我回答之后演变了。因此,我的答案不再匹配。但与此同时,很多人发现这个答案很有用,因为它适合标题。这就是为什么我仍然保留它并且不删除它的原因。
【解决方案2】:

试试这个代码:

final File f = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());

将 'MyClass' 替换为包含 main 方法的类。

或者你也可以使用

System.getProperty("java.class.path")

上述系统属性提供

用于查找包含类文件的目录和 JAR 档案的路径。 类路径的元素由特定于平台的 path.separator 属性中指定的字符。

【讨论】:

  • getCodeSource() 在我的 jvm (jetty) 中返回 null
  • MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath() 还不够吗?为什么要创建File 对象?
【解决方案3】:

您实际上并不想获得主类的路径。根据您的示例,您希望获取当前工作目录,即程序启动的目录。在这种情况下,你可以说new File(".").getAbsolutePath()

【讨论】:

  • 从所有答案中这是最准确的
【解决方案4】:
    ClassLoader cl = ClassLoader.getSystemClassLoader();

    URL[] urls = ((URLClassLoader)cl).getURLs();

    for(URL url: urls){
        System.out.println(url.getFile());
    }

【讨论】:

  • 这通常应该只为您提供应用程序启动的路径。这根本不需要是您的主类所在的位置。
  • 也不保证系统类加载器是URLClassLoader :P
  • 这对我很有用。谢谢
  • ClassCastException: 类 jdk.internal.loader.ClassLoaders$AppClassLoader 无法转换为类 java.net.URLClassLoader
猜你喜欢
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2015-05-09
相关资源
最近更新 更多