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

时间:2010-01-25 17:51:07

标签: java windows-7 jvm

我们公司最近从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...

更新

使用Andreas_D中的错误链接我发现:

我安装Windows 7企业版时,HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop的值为%userprofile%\ Desktop

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

5 个答案:

答案 0 :(得分:24)

大多数注册表项位于:

  

HKEY_CURRENT_USER \软件\微软\的Windows \ CurrentVersion \ Explorer的\壳牌   文件夹

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

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

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.

答案 1 :(得分:15)

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

答案 2 :(得分:11)

它看起来好像 - 无论出于何种原因 - %USERPROFILE%尚未设置为值。如果在命令shell上键入echo %USERPROFILE%,会得到什么?

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

修改

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

答案 3 :(得分:10)

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

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

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

答案 4 :(得分:1)

注册表中的单个字符串值有两种类型"REG_SZ""REG_EXPAND_SZ",它们对"%data%"个字符串的处理方式不同。

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

类型"REG_EXPAND_SZ"会替换"%data%" "data"环境变量值(如果已定义,则不会发生解决方案。)

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

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