【发布时间】:2013-07-06 15:06:52
【问题描述】:
有没有办法获取正在运行的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
有什么办法吗?
===== 编辑 =====
在此处获得解决方案
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
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 中。
【问题讨论】:
-
好吧,您总是可以对结果进行标记(切掉分隔条目的“;”)。类路径属性通常包含几个条目(例如您正在使用的库等)。也许你应该重新考虑你的要求。如果您只对一个文件夹感兴趣,您确定解析类路径是个好主意吗?
-
@Matthias 请注意路径分隔符在不同平台上是不同的。最好使用
System.getProperty("path.separator"); -
一如既往地处理这类问题。 为什么?您要实现什么实际的应用程序功能?设置序列化,“自我卸载程序”..?
-
@AndrewThompson :实际上代码正在使用目录中的一些文件。但是,如果我使用“../..”,那么位于不同目录中的一个/两个 ant 构建会失败。通过在运行时获取路径,解决了这个问题。请告诉是否有任何简单的方法可以防止这种情况发生。
标签: java