如何获取运行java程序的路径

时间:2013-07-09 05:54:47

标签: java

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


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()来代替{{1}}来获取类文件的内容,这将是否有效class位于文件系统或JAR中。

4 个答案:

答案 0 :(得分:118)

使用

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);

答案 1 :(得分:76)

试试这段代码:

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

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

或者您也可以使用

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

上面提到的System属性提供

  

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

答案 2 :(得分:20)

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

答案 3 :(得分:0)

    ClassLoader cl = ClassLoader.getSystemClassLoader();

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

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