Java VM如何决定user.dir系统属性的值?

Java VM如何决定user.dir系统属性的值?,java,eclipse,Java,Eclipse,我正在运行一个简单的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运行这个类时(右键单击源文件并单击RunAs->J

我正在运行一个简单的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运行这个类时(右键单击源文件并单击RunAs->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

当我在命令窗口中更改文件夹时,该值会更改;当我从Eclipse运行程序时,user.dir的值是项目文件夹。所以我想了解,导出“user.dir”值的基础是什么?JVM如何决定,user.dir的值应该是多少?

由属性定义,返回当前工作目录(即JVM启动时的当前目录):

user.dir
用户当前工作状态 目录

我看不出你的例子有什么矛盾之处。这里唯一不清楚的是房产的名称。我不明白他们为什么选择把“用户”放在那里

类似地,如果您从完全不同的路径执行相同的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

属性user.dir被定义为当前工作目录。javadoc详细介绍了各种不同的系统属性


也许你真的想要user.home?

这是用户工作目录。所以,当您在命令提示符下运行它时,您正在更改您的工作目录,而在eclipse中,您的工作目录是项目的主目录。参考:-

除了其他答案之外(我认为这些答案完全回答了这个问题):

如果您实际上正在搜索访问类文件的方法,请不要使用此属性(或任何属性)。使用


要显示到包层次结构根目录的路径,并且在开始处没有
/
的路径将相对于您的目录
Hello.class
。(当它们位于jar文件中时也可以使用。)

默认系统属性

我总是试图找出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...

我一直在寻找这个答案。。始终使用新文件(“”)查找当前目录。谢谢。你知道换房子是否合法吗?我试图改变,但是本地方法看不出有什么区别,但是它们产生的结果是不同的。
-- 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...