Java osgi.baseConfiguration.area未使用相对路径解析

Java osgi.baseConfiguration.area未使用相对路径解析,java,eclipse-rcp,equinox,Java,Eclipse Rcp,Equinox,我的公司生产一小套Eclipse RCP应用程序,这些应用程序安装在Windows上的同一共享位置(C:\Program Files(x86)\MyCompany)。它们共享一个插件目录,但有单独的配置区域 osgi.configuration.area、osgi.user.area和osgi.instance.area的所需位置位于用户的漫游应用程序数据区域(%APPDATA%在Windows XP/7上)。由于本地化要求和操作系统之间路径位置的差异,仅在PRODUCT.ini启动器文件中从@

我的公司生产一小套Eclipse RCP应用程序,这些应用程序安装在Windows上的同一共享位置(C:\Program Files(x86)\MyCompany)。它们共享一个插件目录,但有单独的配置区域

osgi.configuration.area、osgi.user.area和osgi.instance.area的所需位置位于用户的漫游应用程序数据区域(%APPDATA%在Windows XP/7上)。由于本地化要求和操作系统之间路径位置的差异,仅在PRODUCT.ini启动器文件中从@user.home开始构建路径是不够的。添加了在config.ini文件中指定环境变量的功能,但不能在PRODUCT.ini文件中指定

这是安装目录结构:

C:/Program Files (x86)/MyCompany
  configurationProgram1/config.ini
  configurationProgram2/config.ini
  configurationProgram3/config.ini
  jre/
  plugins/*.jar
  Program1.exe
  Program1.ini
  Program2.exe
  Program2.ini
  Program3.exe
  Program3.ini
这是一个示例PRODUCT.ini文件:

--launcher.defaultAction
openFile
-clean
-vmargs
-Xmx768m
-Dosgi.locking=none
-Dosgi.requiredJavaVersion=1.7
-Dvisualvm.display.name=Program1
-Dosgi.baseConfiguration.area=file:configurationProgram1
-Dosgi.sharedConfiguration.area=file:configurationProgram1
#Product Runtime Configuration File
eclipse.application=com.mycompany.app.program1.application
osgi.bundles.defaultStartLevel=4
eclipse.product=com.mycompany.app.program1.product
osgi.splashPath=platform:/base/plugins/com.mycompany.app.program1
osgi.bundles= ...
  org.eclipse.equinox.common@2:start,\
  ...
  org.eclipse.equinox.launcher.win32.win32.x86,\
  org.eclipse.swt.win32.win32.x86
osgi.configuration.area=$APPDATA$/MyCompany/Program1/configuration
osgi.user.area=$APPDATA$/MyCompany/Program1/user
osgi.instance.area=$APPDATA$/MyCompany/Program1/instance
这是一个示例config.ini文件:

--launcher.defaultAction
openFile
-clean
-vmargs
-Xmx768m
-Dosgi.locking=none
-Dosgi.requiredJavaVersion=1.7
-Dvisualvm.display.name=Program1
-Dosgi.baseConfiguration.area=file:configurationProgram1
-Dosgi.sharedConfiguration.area=file:configurationProgram1
#Product Runtime Configuration File
eclipse.application=com.mycompany.app.program1.application
osgi.bundles.defaultStartLevel=4
eclipse.product=com.mycompany.app.program1.product
osgi.splashPath=platform:/base/plugins/com.mycompany.app.program1
osgi.bundles= ...
  org.eclipse.equinox.common@2:start,\
  ...
  org.eclipse.equinox.launcher.win32.win32.x86,\
  org.eclipse.swt.win32.win32.x86
osgi.configuration.area=$APPDATA$/MyCompany/Program1/configuration
osgi.user.area=$APPDATA$/MyCompany/Program1/user
osgi.instance.area=$APPDATA$/MyCompany/Program1/instance
如果启动应用程序时工作目录位于安装目录中(例如,双击Windows资源管理器中的exe,使用定义为安装目录的“开始位置”变量的快捷方式),将osgi.baseConfiguration.area的相对路径解析为正确的绝对路径,并将osgi.configuration.area设置为APPDATA中的正确位置。如果工作目录不是安装目录(例如,双击资源管理器中与程序关联的文件打开应用程序,从任何非安装目录的命令行启动),程序启动,但osgi.baseConfiguration.area仍作为相对路径列出,并且osgi.configuration.area恢复到其备用位置(对于管理员:C:/program Files(x86)/MyCompany/configuration,对于用户:%USERPROFILE%/.eclipse/configuration)。在这两个实例中都正确设置了osgi.user.area和osgi.instance.area

我的自定义本地配置(configurationProgram1/config.ini)很清楚,否则应用程序将无法启动。但是在这个问题案例中,Equinox启动器要么忽略我的osgi.configuration.area声明,要么重置它。我不知道如何通过Equinox启动器启动类(org.eclipse.Equinox.launcher.Main)进一步诊断问题。如果将osgi.baseConfiguration.area定义为绝对路径而不是相对路径,则可以观察到正确的行为

RCP应用程序基于Eclipse平台3.8.1。我确认3.8.2版(3.x分支的最后一个版本)中仍然存在这个问题。目前升级到e4平台不是一个可行的选择,但我想知道e4是否解决了这个问题


我意识到我的多应用程序共享安装是一种独特的情况,因为共享安装的假设似乎是一个具有多个用户本地配置和一个共享配置的单个应用程序。我仍然怀疑这是一个春分错误;然而,我想询问社区,在我这样做之前,我是否对我的安装进行了错误配置,或者误解了有关这些osgi属性的文档。

@SheldonWarkentin在LocationManager()中报告要求plugins/和configuration/目录位于同一目录中,并且命名准确,以便使用相对路径,必须由-startup和--launcher.library定义相对路径来定义plugins/目录。他的建议解决了我眼前的问题

我使用这个答案来提高(“osgi.baseConfiguration.area和-configuration不使用相对路径解析”)的可见性,我提交这个答案是为了解决这个问题。当Equinox团队解决这个bug时,我将结束这个问题

更新:已修复Eclipse错误


Bug 426189已修复,将成为Eclipse 4.4(Luna)版本的一部分。

只需说,您仍然可以使用Eclipse 4.3开发3.x风格的应用程序,而不必转换为e4应用程序(许多东西无法转换)。我没有看到有关此问题的任何错误报告,因此不太可能发生更改。@greg-449,谢谢您的评论。我也找不到任何bug报告,但我确实发现了这个相关的问题:。似乎只有当plugins/和configuration/目录位于同一父目录中时,才可能使用到备用配置目录的相对路径。选项-startup和--launcher.library用于定义插件/目录的位置。