Как получить путь запуска 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
Есть какой-либо способ сделать это?
===== РЕДАКТИРОВАТЬ =====
Здесь есть решение
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.
4 ответа
Попробуйте этот код:
final File f = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath());
заменитьMyClass
'с вашим классом, содержащим основной метод.
В качестве альтернативы вы также можете использовать
System.getProperty("java.class.path")
Вышеупомянутое свойство системы обеспечивает
Путь, используемый для поиска каталогов и JAR-архивов, содержащих файлы классов. Элементы пути к классу разделяются символом, определяемым платформой, указанным в свойстве path.separator.
Использование
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);
Вы на самом деле не хотите, чтобы получить путь к вашему основному классу. Согласно вашему примеру вы хотите получить текущий рабочий каталог, то есть каталог, в котором запущена ваша программа. В этом случае вы можете просто сказать new File(".").getAbsolutePath()
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for(URL url: urls){
System.out.println(url.getFile());
}