Java:System.getProperty(“user.home”)返回“?”

我完全失去了这个: System.getProperty("user.home")System.getProperty("user.name")返回一个问号“?”。

 System-Specs: Kubuntu 9.04 Gnome 2.2.61 Java 1.5.0_16 

我的testing用例如下所示:

 $ more Test.java class Test { public static void main( String[] args ) { System.out.println( System.getProperties() ); } } 

结果是(为了更好的可读性添加换行符,replace了公司名称和自己的名字):

 $ javac Test.java $ java Test { java.runtime.name=Java(TM) 2 Runtime Environment, Standard Edition, sun.boot.library.path=/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/i386, java.vm.version=1.5.0_16-b02, java.vm.vendor=Sun Microsystems Inc., java.vendor.url=http://java.sun.com/, path.separator=:, java.vm.name=Java HotSpot(TM) Server VM, file.encoding.pkg=sun.io, sun.java.launcher=SUN_STANDARD, user.country=US, sun.os.patch.level=unknown, java.vm.specification.name=Java Virtual Machine Specification, user.dir=/home/MYCOMPANY/myname/temp, java.runtime.version=1.5.0_16-b02, java.awt.graphicsenv=sun.awt.X11GraphicsEnvironment, java.endorsed.dirs=/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/endorsed, os.arch=i386, java.io.tmpdir=/tmp, line.separator= , java.vm.specification.vendor=Sun Microsystems Inc., os.name=Linux, sun.jnu.encoding=UTF-8, java.library.path=/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/i386/server:/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/i386:/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/../lib/i386, java.specification.name=Java Platform API Specification, java.class.version=49.0, sun.management.compiler=HotSpot Server Compiler, os.version=2.6.28-15-generic, user.home=?, user.timezone=, java.awt.printerjob=sun.print.PSPrinterJob, file.encoding=UTF-8, java.specification.version=1.5, java.class.path=., user.name=?, java.vm.specification.version=1.0, java.home=/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre, sun.arch.data.model=32, user.language=en, java.specification.vendor=Sun Microsystems Inc., java.vm.info=mixed mode, java.version=1.5.0_16, java.ext.dirs=/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/ext, sun.boot.class.path=/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/rt.jar:/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/i18n.jar:/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/sunrsasign.jar:/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/jsse.jar:/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/jce.jar:/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/lib/charsets.jar:/home/MYCOMPANY/myname/apps/jdk1.5.0_16/jre/classes, java.vendor=Sun Microsystems Inc., file.separator=/, java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport.cgi, sun.io.unicode.encoding=UnicodeLittle, sun.cpu.endian=little, sun.desktop=gnome, sun.cpu.isalist= } 

有人遇到过吗? Java在哪里寻找用户和主目录? 我已经检查了正确设置的HOME环境variables。

这有点令人尴尬,但解决方案只是在64位系统上使用64位JDK。 我从我的旧机器复制了一切,这也意味着一个32位的JDK,这就是问题所在。 它按照预期的方式工作在64位运行时。

对不起,打扰了。

解决方法,而不是解决方案。 您应该可以通过添加-Duser.home=$HOME作为参数进行设置。

 java -Duser.home=$HOME Test 

其他保证属性呢? 如果你打电话给如下的事情会发生什么?

 public static void printAllGuaranteedProperties() { printAProperty ("java.version", "Java version number"); printAProperty ("java.vendor", "Java vendor specific string"); printAProperty ("java.vendor.url", "Java vendor URL"); printAProperty ("java.home", "Java installation directory"); printAProperty ("java.class.version", "Java class version number"); printAProperty ("java.class.path", "Java classpath"); printAProperty ("os.name", "Operating System Name"); printAProperty ("os.arch", "Operating System Architecture"); printAProperty ("os.version", "Operating System Version"); printAProperty ("file.separator", "File separator"); printAProperty ("path.separator", "Path separator"); printAProperty ("line.separator", "Line separator"); printAProperty ("user.name", "User account name"); printAProperty ("user.home", "User home directory"); printAProperty ("user.dir", "User's current working directory"); } public static void printAProperty (String propName, String desc) { System.out.println ("Value for '" + desc + "' is '" + System.getProperty(propName) + "'."); } 

wds在他/她的评论中是正确的。 user.home值似乎取自/ etc / passwd。 你的用户在/etc/passwd是什么行?

如果我将条目更改为/home/nonexisting ,则Test类将打印/home/nonexisting 。 你碰巧有? 在/ etc / passwd中?

这真的很有趣。 看起来像user.home属性不是从$ HOME环境变量。 我试过这个:

 $ echo $HOME && java Test && unset HOME && echo $HOME && java Test /home/grzole /home/grzole /home/grzole 

请注意,shell会忘记HOME变量值,但Java不会。

编辑:我怀疑Java只需要/home/前缀,并添加用户名。 考虑一下:

 # adduser b ... # rm -fr /home/b # su - b No directory, logging in with HOME=/ $ cd /tmp/jb $ java Test /home/b 

也许你的文件系统中没有/home目录?

需要通过本机代码来弄清究竟发生了什么。 user.home变量由Linux系统中的“PAM”模块设置,如果正在使用的模块动态生成这些模块,并且Java实现尝试在没有明确使用PAM的情况下获取该值,则行为是不可预测的,因此“?”

为了完整起见,如果相关系统配置为使用LDAP身份验证(而不是/ etc / passwd),那么这个错误报告中概述的问题可能是问题: http : //bugs.java.com /bugdatabase/view_bug.do?bug_id=6972329 。 确保为您的系统安装了适当的libnss_ldap.so(例如:一个32位的LDAP库,用于32位Java)。 一些可能有助于确定的命令可能是:

 > rpm -qa | grep ldap nss-pam-ldapd-0.7.5-14.el6_2.1.x86_64 # Note x86_64 bit version installed > ls -l /lib64/libnss_ldap* -rwxr-xr-x. 1 root root 44328 Jan 3 2012 /lib64/libnss_ldap.so.2 # ^^^ note 64 bit version installed. > ls /lib/libnss_ldap* ls: cannot access /lib/libnss_ldap*: No such file or directory # ^^^ Indicates 32 bit version is not installed! 

我有同样的问题。 如上所述,问题在于,32位Java还需要安装32位ldap库。 如果不是,则会出现规定的错误。

安装libnss_ldap.so.2和依赖包解决了这个问题。