【问题标题】:How does the Java VM decides the value of the user.dir System property?Java VM 如何决定 user.dir 系统属性的值?
【发布时间】:2011-02-15 12:30:44
【问题描述】:

我正在运行一个具有以下目录结构的简单 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 运行这个类时(右键单击源文件并单击 Run As->Java Application),它会打印到“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的值应该是什么?

【问题讨论】:

    标签: java eclipse


    【解决方案1】:

    java.lang.System specification the 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
    

    【讨论】:

    • 我一直在寻找这个答案。一直在使用 new File("") 来查找当前目录。谢谢。
    • 你知道改变财产是否合法吗?我试图改变,但是下划线原生方法看不出有什么区别,但是它们产生的结果是不同的。
    【解决方案2】:

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

    也许你真的想要 user.home?

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        这是用户工作目录。因此,当您从命令提示符运行它时,您正在更改您的工作目录,而在 Eclipse 的情况下,您的工作目录是项目的主目录。参考:-http://download.oracle.com/javase/tutorial/essential/environment/sysprop.html

        【讨论】:

          【解决方案5】:

          默认系统属性

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

          【讨论】:

            猜你喜欢
            • 2010-11-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-28
            • 2011-08-06
            相关资源
            最近更新 更多