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

Den*_*tta 79 java

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

结构是

D:/
|---Project
       |------bin
       |------src
Run Code Online (Sandbox Code Playgroud)

我希望得到这样的道路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
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?



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

得到了解决这里

解决方案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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

打印出来的:

file:/C:/Users/Jon/Test/foo/Test.class
Run Code Online (Sandbox Code Playgroud)


解决方案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());
Run Code Online (Sandbox Code Playgroud)

请注意,大多数类文件都组装成JAR文件,因此在每种情况下都不起作用(因此IllegalStateException).但是,您可以使用此技术找到包含该类的JAR,并且您可以通过替换调用代替来获取类文件的内容,无论该类是在文件系统上还是在JAR getResourceAsStream()getResource(),这都将起作用.

Ren*_*ink 120

使用

System.getProperty("java.class.path")
Run Code Online (Sandbox Code Playgroud)

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

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

String classpath = System.getProperty("java.class.path");
String[] classpathEntries = classpath.split(File.pathSeparator);
Run Code Online (Sandbox Code Playgroud)

  • 老实说,我不明白这个问题是如何回答这个问题的.系统属性'java.class.path'返回整个类路径,JAR和所有内容.OP要求运行主类(工作目录)的路径. (10认同)
  • @monzonj我同意你的看法.在我回答之后,这个问题就演变了.因此我的答案不再匹配了.但与此同时,很多人发现答案很有用,因为它符合标题.这就是为什么我仍然保留它并且不删除它. (6认同)

Jun*_*san 79

试试这段代码:

final File f = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
Run Code Online (Sandbox Code Playgroud)

MyClass包含main方法的类替换' '.

或者你也可以使用

System.getProperty("java.class.path")
Run Code Online (Sandbox Code Playgroud)

上面提到的System属性提供

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


Ale*_*exR 21

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

  • 从所有答案来看,这是最准确的 (3认同)