Java user.home被设置为%userprofile%并且未被解析

Dan*_*tes 34 java jvm windows-7

我们公司最近从Windows XP升级到Windows 7企业版.JDK安装不再将user.home设置为用户目录的完整路径,而是将user.home设置为%userprofile%.这对Eclipse,Maven等应用程序造成了很多问题.我现在必须在JVM中为每个应用程序设置-Duser.home.还有其他人经历过这个吗?有没有解决这个问题?这与Windows 7企业版的安装有关吗?我试过1.5 JDK和1.6 JDK.

这是属性列表.注意user.home:

-- listing properties --
java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\Program Files\Java\jre6\bin
java.vm.version=16.0-b13
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=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=C:\Users\politesp\Desktop
java.runtime.version=1.6.0_18-b07
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\Program Files\Java\jre6\lib\endorsed
os.arch=x86
java.io.tmpdir=C:\Users\politesp\AppData\Local\Temp\
line.separator=

java.vm.specification.vendor=Sun Microsystems Inc.
user.variant=
os.name=Windows 7
sun.jnu.encoding=Cp1252
java.library.path=C:\WINDOWS\system32;.;C:\WINDOWS\Sun\...
java.specification.name=Java Platform API Specification
java.class.version=50.0
sun.management.compiler=HotSpot Client Compiler
os.version=6.1
user.home=%userprofile%
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=Cp1252
java.specification.version=1.6
user.name=politesp
java.class.path=.
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_18
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...
Run Code Online (Sandbox Code Playgroud)

更新:

使用Andreas_D中的bug链接我发现:

的价值HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop就是%USERPROFILE%\桌面上的我的安装的Windows 7企业版.

当我将此键的值更改C:\Users\politesp\Desktop为时,我的user.home正确解析.知道为什么会这样吗?

Dan*_*tes 25

大多数注册表项位于:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell文件夹

以%userprofile%开头.我更新了以%userprofile%开头的所有注册表项,以C:\ Users\myusername开头.我在Windows XP上验证了路径实际上是硬编码的,并且未使用%userprofile%.IT人员提到,由于Windows 7中使用了默认配置文件,因此注册表密钥默认使用%userprofile%.JVM希望桌面路径是硬编码的.它不会评估环境变量.

您可以逐个更新注册表项,也可以将文件夹导出并更改密钥.以下是导出和导入注册表项的方法:

__PRE__

  • 有趣的是,很多人仍然错过了»不要使用此注册表项«通知那里;) (2认同)

Bre*_*ett 15

这是由于在Java中的长期悬而未决的bug: http://bugs.sun.com/view_bug.do?bug_id=4787931


And*_*s_D 11

在我看来,无论出于何种原因,它%USERPROFILE%都没有被设定为价值.如果echo %USERPROFILE%在命令shell上输入,你会得到什么?

也许这不是操作系统功能,而是配置问题.在我的机器上(Vista)%USERPROFILE%解析到我的主目录,它与Java属性相同user.home

编辑

这是USERPROFILE和user.home的一个Vista/Windows7问题:bug.可能无法解决你的问题可能会给你一个想法..


Luk*_*ško 10

在Java 8修复之前,解决方法是将其添加到环境变量中:
_JAVA_OPTIONS:-Duser.home =%HOMEDRIVE %% HOMEPATH%

或者在命令行中:
set _JAVA_OPTIONS = -Duser.home =%HOMEDRIVE %% HOMEPATH%

我在本页的评论中看到了解决方案:http: //www.timehat.com/javas-user-home-is-wrong-on-windows/