2009-10-08 109 views
11

我有一个多用户/位置RCP应用程序,当前使用多个用户可配置选项。一些偏好是针对该电台的,其中一些偏好是针对用户的。Eclipse偏好存储持久性

选项是从偏好店节省了* .prefs文件“workspace.metadata.plugins \ org.eclipse.core.runtime.settings”。

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

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

回答

7

听起来像您需要将您的首选项存储在所有用户/机器都可以访问的中央位置。这意味着你必须实施你自己的IPersistentPreferencesStore。然后,您可以覆盖org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()以使用它。

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

10

根据所述的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例如)
5

你应该阅读有关multi-user installs

在我们的情况下,我们通过设置分离的config.ini从应用程序配置的每个用户的偏好来包括以下内容:

[email protected]/Application Data/earthrise 
[email protected]/Local Settings/Application Data/earthrise/144/configuration 
osgi.sharedConfiguration.area=c:/program files/earthrise/configuration 
osgi.configuration.cascaded=true 

这样做的结果是,由用户设置的偏好设置存储在他们的漫游配置文件中,但特定于应用程序的配置数据存储在本地设置中。

这并不解决具体用户特定于某个特定工作站的问题,但确实允许让每个用户拥有自己的偏好。

这样做的一个结果就是日食错误日志文件将存储在实例区域中,并在其漫游配置文件中得到执行 - 实际上不是您想要的。您可以在插件中对此进行编码。在eclipse bugzilla中查看解决方法 - 搜索256502

+2

不确定这是否解决了有关保存在本地文件以外的原始问题,但它解决了我的问题,并提供了正确的参考和有用的示例。谢谢! – 2010-07-05 20:22:10

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; 
} 

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