Java: URL.getPath() of current "main" class returns "null", 为什么?
Java: URL.getPath() of current "main" class returns "null", why?
我正在尝试打印执行 main() 的 class 的当前路径,如下所示。我通过谷歌搜索找到了以下语句,但在我的计算机上不起作用(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
为什么第二次打印returns null?如何解决?
谢谢
System.getProperty() is for getting system properties. For example, the "java.home" system property typically points to the location of your Java installation. System properties are described here.
您的代码正在查找系统 属性,其密钥等于您的 URL。您没有定义这样的系统 属性,所以 System.getProperty()
returns null
.
如果你只想打印路径,你应该简单地省略 System.getProperty()
调用:
System.out.println(url.getPath());
Why the second print returns null?
因为您正试图查找一个不存在的系统属性。
这不是查找 Main class 路径的方法。
您需要做的是:
获取 class 的完全限定(或规范)名称;例如
String name = Main.class.getCanonicalName();
将其映射到“.class”文件的资源路径。您需要:
- 替换所有“.”完整字符 classname 带“/”,然后
- 追加“.class”.
使用getResource(resourcePath)
查找URL
。
如果得到的 URL 是 "file:" URL,则可以使用 URL::toFile()
获取文件系统中的路径名。
但是,如果 URL 是 "jar:" URL(如果您从 JAR 文件加载 class,那么 class 将没有文件系统路径名。
请注意 getClassLoader().getResource("")
为您提供了 classloader 根目录的路径。这不是原始 class.
的路径
如果您想要调用 static void main(String[])
方法的 JVM class 的名称,那么您应该可以使用 Java 9+ StackWalker
class (javadoc)。我认为您将需要使用该选项来显示隐藏的帧。
我正在尝试打印执行 main() 的 class 的当前路径,如下所示。我通过谷歌搜索找到了以下语句,但在我的计算机上不起作用(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
为什么第二次打印returns null?如何解决?
谢谢
System.getProperty() is for getting system properties. For example, the "java.home" system property typically points to the location of your Java installation. System properties are described here.
您的代码正在查找系统 属性,其密钥等于您的 URL。您没有定义这样的系统 属性,所以 System.getProperty()
returns null
.
如果你只想打印路径,你应该简单地省略 System.getProperty()
调用:
System.out.println(url.getPath());
Why the second print returns null?
因为您正试图查找一个不存在的系统属性。
这不是查找 Main class 路径的方法。
您需要做的是:
获取 class 的完全限定(或规范)名称;例如
String name = Main.class.getCanonicalName();
将其映射到“.class”文件的资源路径。您需要:
- 替换所有“.”完整字符 classname 带“/”,然后
- 追加“.class”.
使用
getResource(resourcePath)
查找URL
。
如果得到的 URL 是 "file:" URL,则可以使用 URL::toFile()
获取文件系统中的路径名。
但是,如果 URL 是 "jar:" URL(如果您从 JAR 文件加载 class,那么 class 将没有文件系统路径名。
请注意 getClassLoader().getResource("")
为您提供了 classloader 根目录的路径。这不是原始 class.
如果您想要调用 static void main(String[])
方法的 JVM class 的名称,那么您应该可以使用 Java 9+ StackWalker
class (javadoc)。我认为您将需要使用该选项来显示隐藏的帧。