【问题标题】:Java: URL.getPath() of current "main" class returns "null", why?Java:当前“主”类的 URL.getPath() 返回“null”,为什么?
【发布时间】:2019-04-26 16:10:26
【问题描述】:

我正在尝试打印执行 main() 的类的当前路径,如下所示。我通过谷歌搜索找到了以下语句,但在我的计算机上不起作用(windows+intellij)

public class core3 {
    public static void main(String[] args) {
        try {
            URL url = new core3().getClass().getClassLoader().getResource("");
            System.out.println(url);
            System.out.println(System.getProperty(url.getPath()));//print null
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

实际上是打印出来的

file:/D:/Documents/myproject/test01/target/classes/
null

为什么第二次打印返回 null?如何解决?

谢谢

【问题讨论】:

  • 为什么期望系统属性包含该路径?

标签: java class url path main


【解决方案1】:

System.getProperty() 用于获取系统属性。例如,“java.home”系统属性通常指向 Java 安装的位置。系统属性描述here

您的代码正在查找密钥等于您的 URL 的系统属性。您没有定义这样的系统属性,所以System.getProperty() 返回null

如果你只想打印路径,你应该简单地省略 System.getProperty() 调用:

System.out.println(url.getPath());

【讨论】:

    【解决方案2】:

    为什么第二次打印返回 null?

    因为您正在尝试查找不存在的系统属性。

    这不是找到 Main 类路径的方法。

    你需要做的是:

    1. 获取类的完全限定(或规范)名称;例如

        String name = Main.class.getCanonicalName();
      
    2. 将其映射到“.class”文件的资源路径。您需要:

      • 替换所有“.”完整类名中带有“/”的字符,然后
      • 附加“.class”。
    3. 使用getResource(resourcePath) 查找URL

    如果生成的 URL 是“file:” URL,则可以使用 URL::toFile() 获取文件系统中的路径名。

    但是如果 URL 是一个“jar:”URL(就像你从 JAR 文件加载类一样),那么该类将没有文件系统路径名。


    请注意,getClassLoader().getResource("") 为您提供类加载器根目录的路径。这不是原始类的路径。


    如果您想要调用 static void main(String[]) 方法的 JVM 类的名称,那么您应该能够使用 Java 9+ StackWalker 类 (javadoc) 来获取它。我认为您将需要使用该选项来显示隐藏的框架。

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      相关资源
      最近更新 更多