Как Java VM определяет значение системного свойства user.dir? - PullRequest
4 голосов
/ 15 февраля 2011

Я запускаю простую Java-программу со структурой каталогов ниже:

MyProject (A project in my Eclipse IDE)
 '-- src
      '-- Hello.java

В Hello.java я печатаю значение системного свойства 'user.dir'.

System.out.println(System.getProperty("user.dir"));

Скомпилированный файл для моего класса хранится в папке MyProject\bin.

Когда я запускаю этот класс из Eclipse (щелкните правой кнопкой мыши по исходному файлу и выберите «Запустить как-> Приложение Java»),печатает путь до папки «MyProject», т.е. D:\Projects\Workspace\MyProject в окне консоли.

Затем я использовал командное окно для запуска той же программы.Это то, что я набрал в окне:

D:\Projects\Workspace\MyProject\bin>java Hello

и вывод на консоль: D:\Projects\Workspace\MyProject\bin

bin был добавлен к предыдущему значению для user.dir.

Далее, чтобы проверить больше, я на этот раз выполнил команду Java из другой папки в окне команд:

D:\Projects\Workspace\MyProject>java -classpath D:\Projects\Workspace\MyProject\bin Hello

На этот раз вывод в окне команд: D:\Projects\Workspace\MyProject

Thisзначение изменяется, когда я меняю папку в командном окне, и когда я запускаю программу из Eclipse, значением для user.dir является папка проекта.Итак, я хотел бы понять, что является основой для получения значения 'user.dir'?Как JVM решает, каким должно быть значение для user.dir?

Ответы [ 5 ]

9 голосов
/ 15 февраля 2011

Как определено спецификацией java.lang.System, свойство user.dir возвращает текущий рабочий каталог (т. Е. Текущий каталог при запуске JVM):

user.dir User'sтекущий рабочий каталог

Я не вижу ничего противоречивого в вашем примере.Единственное, что здесь неясно, это название объекта.Я не понимаю, почему они решили добавить туда user.

Аналогично, если вы выполняете ту же программу на Java с совершенно другого пути, вы получите другой путь в качестве результата.Попробуйте сами:

 c:
 cd c:\
 java -cp D:\Projects\Workspace\MyProject\bin Hello

То, что Eclipse делает перед запуском вашей программы, выглядит примерно так:

 d:
 cd d:\projects\workspace\myproject
 java -cp d:\projects\workspace\myproject\bin Hello
1 голос
/ 15 февраля 2011

В дополнение к другим ответам (которые, я думаю, полностью отвечают на вопрос):

Если вы на самом деле ищете способ получить доступ к файлам классов, не используйте это свойство (или вообще какое-либо свойство). Используйте

System.out.println( Hello.class.getResource("/") );

, чтобы показать путь к корню вашей иерархии пакетов, а путь без / в начале будет относительно вашей директории Hello.class. (Это работает, когда они тоже находятся внутри jar-файла.)

1 голос
/ 15 февраля 2011

Свойство user.dir определено как текущий рабочий каталог. Javadoc для System подробно описывает различные свойства системы.

Может быть, вы действительно хотите user.home?

0 голосов
/ 27 февраля 2011

Системные свойства по умолчанию

Я всегда пытаюсь выяснить свойства по умолчанию в Java, и для этого мне нужно написать программу. Если есть что-то в сети, то я могу избежать этой проблемы. Хорошо иметь его здесь:)

Код:

public class Test {
    public static void main(String[] args) {
        Properties prop = System.getProperties();
        prop.list(System.out);
    }
}

Вывод для Windows XP

-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\Program Files\Java\jre6\bin
java.vm.version=19.0-b09
java.vm.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
path.separator=;
java.vm.name=Java HotSpot(TM) Client VM
file.encoding.pkg=sun.io
user.country=US
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=Service Pack 3
java.vm.specification.name=Java Virtual Machine Specification
user.dir=C:\workspace\Test
java.runtime.version=1.6.0_23-b05
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\Program Files\Java\jre6\lib\endorsed
os.arch=x86
java.io.tmpdir=C:\DOCUME~1\Name~1\LOCALS~1\Temp\
line.separator=

java.vm.specification.vendor=Sun Microsystems Inc.
user.variant=
os.name=Windows XP
sun.jnu.encoding=Cp1252
java.library.path=C:\Program Files\Java\jre6\bin;.;C:\W...
java.specification.name=Java Platform API Specification
java.class.version=50.0
sun.management.compiler=HotSpot Client Compiler
os.version=5.1
user.home=C:\Documents and Settings\User Name
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=Cp1252
java.specification.version=1.6
user.name=User Name
java.class.path=C:\workspace\Test\bin
java.vm.specification.version=1.0
sun.arch.data.model=32
java.home=C:\Program Files\Java\jre6
java.specification.vendor=Sun Microsystems Inc.
user.language=en
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode, sharing
java.version=1.6.0_23
java.ext.dirs=C:\Program Files\Java\jre6\lib\ext;C:...
sun.boot.class.path=C:\Program Files\Java\jre6\lib\resour...
java.vendor=Sun Microsystems Inc.
file.separator=\
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=pentium_pro+mmx pentium_pro pentium+m...
0 голосов
/ 15 февраля 2011

Это рабочий каталог пользователя. Итак, когда вы запускаете его из командной строки, вы меняете свой рабочий каталог, тогда как в случае затмения ваш рабочий каталог является домашним каталогом проекта. Ссылка: - http://download.oracle.com/javase/tutorial/essential/environment/sysprop.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...