Eclipse Preference存储持久性

时间:2009-10-08 18:59:58

标签: eclipse eclipse-rcp

我有一个多用户/位置RCP应用程序,目前使用多个用户可配置选项。有些偏好是针对电台的,有些是特定于用户的。

选项来自首选项存储,它将* .prefs文件保存到“workspace.metadata.plugins \ org.eclipse.core.runtime.settings”。

如果我们只使用一台机器/用户,那就没问题。但是,如果用户要去另一个电台,那么用户将使用为该电台设置的任何偏好。

是否可以为持久性(而不是文件)指定另一种形式?

4 个答案:

答案 0 :(得分:9)

根据eclipse wiki,首选项是基于文件的,并存储:

  • 对于每个安装(但这可能因多用户安装而异),存储在<eclipse_home>/eclipse/configuration/.settings/中的文件中 每个插件通常有一个文件,扩展名为.prefs 请注意,很少有插件使用安装范围的首选项。
  • 表示每个工作区,存储在<workspace>/.metadata/.plugin/org.eclipse.core.runtime/.settings中的文件中 每个插件通常有一个文件,扩展名为.prefs
  • 每个项目的
  • - 用于项目级设置 - 存储在项目文件夹的.settings子目录中的文件

因此,如果文件选项保留,您可能需要:

  • 在用户特定目录中手动导出/重新导入会话设置(繁琐)
  • 或制作某种自动机制:
    • 将设置导出到应用程序出口处的用户注册表(HKEY_CURRENT_USER/Software/MyRCP/...),然后
    • 通过读取这些注册表项并覆盖本地.prefs目录中的workspace.metadata.plugins\org.eclipse.core.runtime.settings文件来导入它们
  • 或通过某种特定于用户的链接共享这些设置(围绕RCP启动的包装器将负责建立正确的链接,例如在Windows with junctions上)

答案 1 :(得分:8)

听起来您需要将您的偏好存储在所有用户/机器都可以到达的中心位置。这意味着您必须实现自己的IPersistentPreferencesStore。然后,您可以覆盖org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()以使用它。

更大的问题是如何实现中央首选项存储,但这取决于您使用的技术。通常,如果您的项目使用中央服务器,您可能应该在那里存储您的首选项。例如,如果您的项目已经使用了关系数据库,那么一种解决方案是创建适当的数据库表并实现IPersistentPreferencesStore以通过JDBC访问这些表。

答案 2 :(得分:5)

您应该阅读multi-user installs

在我们的案例中,我们通过将config.ini设置为包含以下内容,将每用户首选项与应用程序配置分开:

osgi.instance.area=@user.home/Application Data/earthrise
osgi.configuration.area=@user.home/Local Settings/Application Data/earthrise/144/configuration
osgi.sharedConfiguration.area=c:/program files/earthrise/configuration
osgi.configuration.cascaded=true

这样做的结果是用户设置的任何首选项都存储在漫游配置文件中,但特定于应用程序的配置数据存储在本地设置中。

这不能解决具有特定于特定工作站的用户首选项的问题,但确实允许每个用户拥有自己的首选项。

这样做的一个问题是,eclipse错误日志文件将存储在实例区域中,并在其漫游配置文件中随身携带 - 实际上并不是您想要的。您可以在插件中编写代码。请参阅eclipse bugzilla的解决方法 - 搜索256502

答案 3 :(得分:0)

只是一个想法!

由于PreferenceStore的load()方法执行:

public void load() throws IOException {
    FileInputStream in = new FileInputStream(filename);
    load(in);
    in.close();
}

您可以创建PreferenceStore

PreferenceStore(String filename)

或设置其文件名

public void setFilename(String name) {
    filename = name;
}

您可能能够将文件名“破解”到共享服务器上的某个位置(或者用户共享主文件夹)......