Java user.home устанавливается в% userprofile% и не разрешается

Недавно наша компания обновилась с Windows XP до Windows 7 Enterprise. Установка JDK больше не устанавливает user.home в полный путь к каталогу пользователя, но вместо этого устанавливает user.home в %userprofile%. Это вызывает множество проблем с такими приложениями, как Eclipse, Maven и т.д. Теперь мне нужно установить -Duser.home в JVM для каждого приложения. Кто-нибудь еще испытал это? Это можно как-то исправить? Будет ли это связано с установкой 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...

Update:

Используя ссылку на ошибку от Andreas_D, я обнаружил:

Значение HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Desktop % userprofile%\Desktop при установке Windows 7 Enterprise.

Когда я изменяю значение этого ключа на C:\Users\politesp\Desktop, мое user.home правильно решает. Любая идея, почему это происходит?

Ответ 1

Большинство разделов реестра, расположенных по адресу:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Папки

началось с% userprofile%. Я обновил все ключи реестра, которые начинались с% userprofile%, чтобы начать с C:\Users\myusername. Я проверял в Windows XP, что пути на самом деле жестко закодированы и что% userprofile% не используется. ИТ-ребята упоминали, что ключи реестра по умолчанию использовали% userprofile% из-за профиля по умолчанию, который используется в Windows 7. 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.

Ответ 3

Мне кажется, что - по каким-то причинам - %USERPROFILE% не было установлено значение. Что вы получите, если в командной строке введите echo %USERPROFILE%?

Возможно, это не функция ОС, а проблема конфигурации. На моей машине (Vista) %USERPROFILE% разрешается мой домашний каталог, и он тот же для свойства Java user.home

Edit

Здесь проблема Vista/Windows7 с USERPROFILE и user.home: bug. Может не решить вашу проблему, может дать вам идею.

Ответ 4

Пока 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/

Ответ 5

Однострочные значения в реестре имеют 2 типа "REG_SZ" и "REG_EXPAND_SZ", и они обрабатывают строки "%data%" по-разному.

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

Тип "REG_EXPAND_SZ" заменяет "%data%" значение переменной среды "data", если оно определено иначе, не имеет никакого разрешения.

Аплеты для редактирования переменных среды Windows GUI выбирают правильный тип, если в поле значения появляется "%name%".

Эта проблема звучит как установщик, делающий неправильный выбор при записи в реестр.