Java用户.home被设置为%userprofile%而不被parsing

我们公司最近从Windows XP升级到Windows 7 Enterprise。 JDK安装不再将user.home设置为用户目录的完整path,而是将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正确parsing。 任何想法为什么发生这种情况?

大多数registry项位于:

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

以%userprofile%开始。 我更新了以%userprofile%开头的所有registry项,以C:\ Users \ myusername开头。 我在Windows XP上validation过,path实际上是硬编码的,%userprofile%没有被使用。 IT人员提到,由于在Windows 7中使用了默认configuration文件,registry项默认使用%userprofile%.JVM希望桌面path是硬编码的。 它不会评估环境variables。

您可以逐个更新registry项,也可以导出文件夹并更改密钥。 以下是如何导出和导入registry项的方法:

 1. Go to Start > Run. 2. Type regedit. This opens the registry editor. 3. Browse to HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders. 4. Right click on Shell Folders and choose Export. 5. Select the Desktop as the destination and enter Shell Folders for the file name and save the file. 6. Open the file in a text editor and replace %userprofile% with C:\\Users\\yourusername. Save and close the file. 7. Go back to the registry editor window and select File > Import from the main menu. 8. Select Shell Folders.reg and click Open. 9. Close the registry editor and delete the Shell Folders.reg file off of the desktop. 

这是由于Java中一个长期存在的bug: http : //bugs.sun.com/view_bug.do?bug_id=4787931

它看起来像 – 无论出于什么原因 – %USERPROFILE%还没有被设置为一个值。 如果在命令行中键入echo %USERPROFILE% ,会得到什么结果?

也许这不是一个操作系统function,但configuration问题。 在我的机器上(Vista) %USERPROFILE%parsing到我的主目录,对于Java属性user.home

编辑

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

在Java 8解决这个问题之前,解决scheme是将其添加到环境variables中:
_JAVA_OPTIONS:-Duser.home =%HOMEDRIVE %% HOMEPATH%

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

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

registry中的单个string值有两种types"REG_SZ""REG_EXPAND_SZ" ,它们以不同的方式处理"%data%"string。

 Type "REG_SZ" leaves any "%data%" as is. 

如果定义了types"REG_EXPAND_SZ"则将"data"环境variables值replace为"%data%" ,否则不会进行parsing。

Windows GUI环境variables编辑小程序将根据值字段中是否显示"%name%"select正确的types。

这个问题听起来像是一个安装程序在写入registry时做出糟糕的select。