【问题标题】:Where are the Java preferences stored in Windows 7?Windows 7 中的 Java 首选项存储在哪里?
【发布时间】:2011-06-24 06:28:58
【问题描述】:

我们在某些应用程序中使用 Java 首选项,但并没有真正注意到这一点,因为进行调用的实用程序相当陈旧,并且是在 Windows XP 时代编写的。但似乎 Java 首选项不再存储在 Windows 7 的注册表中 - 或者它们存储在不同的地方。

我期待它出现在:

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs

但我没有看到它。

让它更奇怪的是,当我运行这个应用程序时:

public static void main( final String[] args ) throws BackingStoreException {

    Preferences systemRoot = Preferences.systemRoot();
    Preferences preferences = systemRoot.node( "com/mycompany/settings" );

    systemRoot.put( "foo", "bar" );
    systemRoot.put( "baz", "lolz" );
    System.out.println( "-------------------------------" );

    String[] keys = preferences.keys();
    for( String key : keys ) {
        System.out.println( key );
    }

    System.out.println( "-------------------------------" );

    keys = systemRoot.keys();
    for( String key : keys ) {
        System.out.println( key );
    }
}

它实际上会写入(我可以注释掉并再次运行它并且它可以工作)但我没有在注册表中看到新键。

另外,我似乎无法在任何地方看到此文档。提前致谢。

EDIT #1 这很重要的唯一原因是设置的变化取决于它运行的环境。话虽如此,通过手动插入注册表项然后进行一些检查来模拟该环境通常很有用。

我以管理员身份运行,但我没有在注册表中看到我期望的键。

【问题讨论】:

  • 您可以使用 Sysinternals Process Monitor 查看该进程的注册表和文件系统操作,并尝试推断读取/写入的位置。
  • 为什么要在HKEY_LOCAL_MACHINE下存储任何东西?我希望它会在HKEY_CURRENT_USER 下运行。另外:你为什么在乎?它没有记录是有原因的:你不应该依赖它,它可以随时更改。
  • 必须在那里:顺便说一句,您是以管理员身份运行的吗?
  • 抱歉,我没有看到您使用的是systemRoot(),而不是userRoot()
  • 我将添加编辑以澄清。

标签: java windows-7 preferences


【解决方案1】:

他们在当前用户下:HKEY_CURRENT_USER\Software\JavaSoft\Prefs

【讨论】:

  • 您确认了吗? eg:使用上面的代码然后检查你的注册表?它没有出现在我的注册表中。
  • 用户设置在 HKCU 下,系统设置在 HCKS 下(除非你用系统变量覆盖它)。然而,32 位 java 的 64 位 Windows 上的路径在 WoW64 下,如上面回答的那样。
【解决方案2】:

对于systemRoot:

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\...

对于用户根:

HKEY_CURRENT_USER\SOFTWARE\JavaSoft\...

【讨论】:

  • 您确认了吗? eg:使用上面的代码然后检查你的注册表?它没有出现在我的注册表中。
  • 是的,这似乎是一个合理的解释。然而,我也无法在虚拟位置找到钥匙。嗯……
【解决方案3】:

我在使用 systemRoot 首选项时遇到了类似的问题,在注册表监视器的帮助下,我发现它们的存储位置会根据 Windows 操作系统是 32 位还是 64 位而发生变化。

在 32 位操作系统下(在我的例子中是 Windows XP)systemRoot 注册表路径是

HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Prefs

在 64 位操作系统下(在我的例子中是 Windows 7)systemRoot 注册表路径是

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Prefs

两个系统都使用相同的 32 位 JRE (JRE 1.6.0_20-b02)。

在 64 位 Windows 上运行 32 位应用程序(JVM)时,注册表会自动插入 Wow6432Node 路径元素,以允许为 32 位或 64 位编译的应用程序在同一台机器上共存同时保持它们的设置分开。

【讨论】:

  • 在 windows 7 64 位上我在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft 下看不到任何首选项,但我确实在 HKEY_CURRENT_USER\Software\JavaSoft\Prefs 看到了它们
【解决方案4】:

一些首选项存储在注册表项中,而另一些(现在我要检查究竟是哪些)似乎存储在文本文件中;例如,首选项“在浏览器密钥库中使用证书和密钥”存储在 C:\Users\%USER%\AppData\LocalLow\Sun\Java\Deployment\deployment.properties 中:

#deployment.properties
#Thu Jun 12 15:26:53 CEST 2014

deployment.security.browser.keystore.use=false

deployment.modified.timestamp=1402579613914
deployment.version=7.21
deployment.browser.path=C\:\\Program Files\\Mozilla Firefox\\firefox.exe
#Java Deployment jre's
#Thu Jun 12 15:26:53 CEST 2014
deployment.javaws.jre.0.registered=true
deployment.javaws.jre.0.platform=1.7
deployment.javaws.jre.0.osname=Windows
deployment.javaws.jre.0.path=C\:\\Program Files\\Java\\jre7\\bin\\javaw.exe
deployment.javaws.jre.0.product=1.7.0_60
deployment.javaws.jre.0.osarch=x86
deployment.javaws.jre.0.location=http\://java.sun.com/products/autodl/j2se
deployment.javaws.jre.0.enabled=true
deployment.javaws.jre.0.args=

这已在 Windows 7 pro/32 位 - JRE 1.7.0_60 (i586) 上验证

来源:
Related question on this site
Oracle - Java SE documentation - Deployment Configuration File and Properties

祝你有美好的一天

【讨论】:

  • 这很可能是使用java.util.Properties 管理的“属性文件”,这是Java 1.0 中引入的一个非常基本的API。问题的主题是 Preferences API,这是 Java 1.4 中引入的一种更复杂的机制。不过,每个都有自己的适用领域。
猜你喜欢
  • 2013-06-30
  • 1970-01-01
  • 2010-10-15
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多