Java中的user.home被设置为%userprofile%,但未被解析。

36

我们公司最近从Windows XP升级到了Windows 7 Enterprise。JDK安装不再将user.home设置为用户目录的完整路径,而是设置为%userprofile%。这会导致Eclipse、Maven等应用程序出现许多问题。现在我必须为每个应用程序在JVM中设置-Duser.home。有其他人经历过这种情况吗?有解决方法吗?这与安装Windows 7 Enterprise有关吗?我已经尝试了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...

更新:

根据 Andreas_D 给出的错误链接,我发现:

在我的 Windows 7 Enterprise 安装中,HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop 的值为 %userprofile%\Desktop

当我将此键的值更改为 C:\Users\politesp\Desktop 时,我的 user.home 正确解析。您有任何想法为什么会发生这种情况吗?


2
这个问题在Java 8中应该已经被修复了... http://bugs.sun.com/view_bug.do?bug_id=4787931 - AncientSwordRage
5个回答

25

大多数注册表键位于:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders

开始于 %userprofile%。我更新了所有以 %userprofile% 开头的注册表键,使它们以 C:\Users\myusername 开头。在 Windows XP 上,我验证了路径实际上是硬编码的,而没有使用 %userprofile%。IT人员提到,由于 Windows 7 中使用了默认配置文件,因此注册表键默认使用 %userprofile%。JVM 需要硬编码桌面路径。它不会评估环境变量。

您可以逐个更新注册表键,也可以导出文件夹并更改键。以下是如何导出和导入注册表键的方法:

  1. 转到开始 > 运行。
  2. 输入 regedit。这将打开注册表编辑器。
  3. 浏览到 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders
  4. 右键单击 Shell Folders 并选择导出。
  5. 选择桌面作为目标文件夹,并键入 Shell Folders 作为文件名并保存文件。
  6. 在文本编辑器中打开文件,用 C:\\Users\\yourusername 替换 %userprofile%。保存并关闭文件。
  7. 返回到注册表编辑器窗口,从主菜单中选择 文件 > 导入。
  8. 选择 Shell Folders.reg 并单击打开。
  9. 关闭注册表编辑器,然后删除桌面上的 Shell Folders.reg 文件。

2
有趣的是,很多人仍然忽略了“不要使用此注册表键”的提示 ;) - Joey
你的问题研究得很好,对答案进行了出色的跟进。网络对于这个问答更加便利。 - kevinarpe

17

今天早上我也看到了这个bug。难以置信他们做出了这样的选择,却没有听取所有人的抱怨... - Sébastien Nussbaumer

11

看起来对我来说,由于某种原因,%USERPROFILE%没有被设置为一个值。如果你在命令行中输入echo %USERPROFILE%,你会得到什么结果?

也许这不是一个操作系统的特性,而是一个配置问题。在我的机器上(Vista),%USERPROFILE%解析为我的主目录,对于Java属性user.home也是一样的。

编辑

这里有一个关于USERPROFILE和user.home的Vista/Windows7问题:bug。也许不能解决你的问题,但可能会给你一个思路。


echo %USERPROFILE% 将打印出 C:\Users\politesp。 - Dan Polites
也许它是大小写敏感的?你尝试过使用USERPROFILE而不是userprofile吗? - kpolice
也许这是在从XP升级到Win7的过程中发生的——%userprofile%可能在创建某些注册表键时未被设置。你的注册表甚至可能有更多的键带有片段%userprofile%,而不是真实路径。 - Andreas Dolk
我的电脑是全新安装的。我跟IT小伙伴们说了一下,他们认为这可能与漫游配置文件有关。我对漫游配置文件不是很了解。 - Dan Polites
IT人员表示,注册表是这样的,因为它正在使用默认配置文件。 - Dan Polites
显示剩余2条评论

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/


1
注册表中的单个字符串值有两种类型"REG_SZ""REG_EXPAND_SZ",它们以不同的方式处理"%data%"字符串。
Type "REG_SZ" leaves any "%data%" as is.

类型"REG_EXPAND_SZ"会替换"%data%",如果定义了"data"环境变量值,则进行解析,否则不进行解析。

Windows GUI环境变量编辑小程序根据值字段中是否出现"%name%"来选择正确的类型。

这个问题听起来像是安装程序在写入注册表时做出了错误选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接