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

2019-07-20 09:35发布

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

System-Specs:
Kubuntu 9.04
Gnome 2.2.61
Java 1.5.0_16

我的测试用例看起来像这样:

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

结果(添加换行符以提高可读性,更换公司名称和自己的名字):

$ 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环境变量。

Answer 1:

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

对不起打扰。



Answer 2:

一种解决方法,而不是解决方案。 您应该能够通过添加与设置它-Duser.home=$HOME作为参数。

java -Duser.home=$HOME Test


Answer 3:

那其他保障性质? 如果您对像下面这样的调用会发生什么?


   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) + "'.");
    }



Answer 4:

WDS是正确的,他/她的意见。 该user.home值似乎是从/ etc / passwd文件拍摄。 什么是你的行/etc/passwd为你的用户?

如果我改变了进入/home/nonexisting ,在Test类印刷/home/nonexisting 。 你碰巧有? 在/ etc / passwd文件?



Answer 5:

这真的很有趣。 貌似user.home属性不从$ HOME环境变量拍摄。 我已经试过这样:

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

/home/grzole

请注意,外壳忘记了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目录中的文件系统呢?



Answer 6:

需要通过本机代码毛孔弄清楚究竟发生了什么。 该变量的user.home是在Linux系统中的“PAM”模块设置,如果使用的模块动态生成这些和Java实现正试图获得价值不明确使用PAM那么行为是不可预知的,因此“?”



Answer 7:

为了完整起见,它也像,如果有问题的系统配置为使用LDAP身份验证(而不是/ etc / passwd文件),那么这个错误报告中列出的问题可能是问题: http://bugs.java.com /bugdatabase/view_bug.do?bug_id=6972329 。 确保相应的libnss_ldap.so安装了您的系统(例如:为32位Java使用32位LDAP库)。 某些命令可能是确定,这可能会有所帮助:

> 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!


Answer 8:

我有同样的问题。 如以上提到的那样,问题是,在32位Java还需要安装32个LDAP库。 如果没有,就会出现错误描述下。

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



文章来源: Java: System.getProperty(“user.home”) returns “?”
标签: java kubuntu