93

有没有办法获取正在运行的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

有没有办法做到这一点?



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

在这里得到解决方案

解决方案 1(由Jon 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


解决方案 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 中,这都将起作用.

4

4 回答 4

132

采用

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);
于 2013-07-09T06:03:07.923 回答
101

试试这个代码:

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

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

或者,您也可以使用

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

上述系统属性提供

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

于 2013-07-09T05:58:22.193 回答
26

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

于 2013-07-09T06:00:27.957 回答
2
    ClassLoader cl = ClassLoader.getSystemClassLoader();

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

    for(URL url: urls){
        System.out.println(url.getFile());
    }
于 2013-07-09T05:57:27.113 回答