Eclipse OSGI配置:相对路径和/或类似@config.dir的替换?

Eclipse OSGI配置:相对路径和/或类似@config.dir的替换?,eclipse,configuration,osgi,eclipse-rcp,equinox,Eclipse,Configuration,Osgi,Eclipse Rcp,Equinox,在我的RCP应用程序中,我希望将一个属性(osgi.java.profile)指向一个文件,并希望使用相对于我的安装和配置目录的路径 config.ini中支持哪种类型的变量有明确的规范吗 @config.dir似乎是受支持的,内置代码中有引用,并且它总是作为典型的示例(例如) 然而,在Eclipse help/等文档中,它提到了一些“符号位置”,如@user.home;然而,这似乎相当有限,不包括@config.dir 我甚至还深入研究了org.eclipse.osgi源代码,并没有发现任何

在我的RCP应用程序中,我希望将一个属性(
osgi.java.profile
)指向一个文件,并希望使用相对于我的安装和配置目录的路径

config.ini中支持哪种类型的变量有明确的规范吗


@config.dir似乎是受支持的,内置代码中有引用,并且它总是作为典型的示例(例如) 然而,在Eclipse help/等文档中,它提到了一些“符号位置”,如@user.home;然而,这似乎相当有限,不包括@config.dir

我甚至还深入研究了
org.eclipse.osgi
源代码,并没有发现任何与此相关的参考资料(我确实找到了LocationManager及其硬编码变量替换@user.dir&co)。 我可以以某种方式引用任意的系统属性吗

@config.dir是一个特例,仅由P2处理吗更新:似乎就是这样。。查看EclipseSDK,关于。。配置对话框显示@config.dir未解析,可能是春分点的字面意思


感谢您的提示。

来自org.eclipse.core.runtime.adapter.LocationManager,以下是特殊标记:

    // Data mode constants for user, configuration and data locations.                                                                                          
    private static final String NONE = "@none"; //$NON-NLS-1$                                                                                                   
    private static final String NO_DEFAULT = "@noDefault"; //$NON-NLS-1$                                                                                        
    private static final String USER_HOME = "@user.home"; //$NON-NLS-1$                                                                                         
    private static final String USER_DIR = "@user.dir"; //$NON-NLS-1$                                                                                           

为什么不使用两个系统属性变量

一个名为
-Dmy.relativepath=filename
,由eclipse安装文件夹(工作区或任何地方)的相对路径代码处理,另一个名为
-Dmy.path=absolutepath


系统属性被传递给jvm,如果您想在其值中使用变量,则需要在本机启动器(如eclipse.exe)中使用一些技巧(在运行时翻译变量)。

查看如何在
org.eclipse.osgi.framework.internal.core.framework
中解析osgi.java.profile:

// check for the java profile property for a url
String propJavaProfile = FrameworkProperties.getProperty(Constants.OSGI_JAVA_PROFILE);
if (propJavaProfile != null)
    try {
        // we assume a URL
        url = new URL(propJavaProfile);
    } catch (MalformedURLException e1) {
        // try using a relative path in the system bundle
        url = findInSystemBundle(propJavaProfile);
    }

这意味着osgi.java.profile必须指向完全限定的URL,或者指向系统包中的相对路径(
org.eclipse.osgi
)。这使得在不修补Eclipse的情况下无法使用安装目录相对路径。

您可以使用平台URL()来实现这一点,即

osgi.java.profile = platform:/config/java_profile.txt
config.ini
中,将指向当前配置目录中的文件
java_profile.txt

您还可以使用config.ini中的现有系统属性:

osgi.java.profile = ${osgi.configuration.area}/java_profile.txt

我参加聚会迟到了,但希望这会对以后的其他人有所帮助

从Eclipse3.8/4.2(2012年6月)开始,您可以将Java属性和环境变量替换为config.ini文件()。Equinox启动器不支持eclipse.ini启动器文件中的替换。语法使用美元符号($VARIABLE$)表示变量替换:

osgi.configuration.area=$APPDATA$/MyCompany/MyProgram/configuration
osgi.user.area=$APPDATA$/MyCompany/MyProgram/user
osgi.instance.area=$APPDATA$/MyCompany/MyProgram/instance
我想你可以用这样的东西来达到你的目的:

osgi.java.profile=$osgi.install.area$/path/to/profile.txt

谢谢克里斯-我找到了同样的清单(见我的问题)。它似乎非常有限-所以我想知道我是否遗漏了一些东西(例如系统属性或类似的sg)。在通过框架进行调试之后,似乎没有什么希望。我还在Equinox新闻组上问了一个类似的问题-等待回答。@inger:从源代码来看,这些是唯一受支持的选项。好吧,从只查看LocationManager来看,是的,有点清楚-我也在几分钟内找到了它。但这并不能解释为什么@config.dir在当时是受支持的(正如我所说的,我现在假设它是P2的一种特殊处理,我认为这很奇怪)。我只是希望这个问题能以其他方式得到解决,否则osgi.java.profile对于RCP开发来说似乎毫无用处。如果这个程序只是挂接了${system.properties}而不是愚蠢的硬编码替换,那就太好了。+1,我为这个问题提供了一个悬赏。我确实需要能够为config.ini中的eclipse.p2.data.area指定相对于安装目录的路径,而不是相对于配置区域的路径。如果有人能告诉我怎么做的话,那就有200个代表@佩洛特,谢谢你的鼓励-让我们希望。。事实上,我非常确信我的问题没有一个精确的答案(这是难以置信的,但替代似乎在核心硬编码)。。但是,由于您似乎对P2特定的属性更感兴趣,因此它可能会得到更好的支持,即@config.dir似乎确实是由P2配置处理专门处理的,这可能不是唯一的一个。当然,我可以尝试一种解决方法,创建Eclipse应该具有的属性,但至少需要一个额外的启动程序脚本,额外的黑客。。在此之后,我仍然不确定能否在config.ini中访问该属性,作为其他属性定义的一部分。。我真正感兴趣的是,如果有一些Eclipse特性来做这件事,我错过了。@inger,这肯定是p2的一个棘手问题。您可以发现@config.dir在运行时被框架属性“osgi.configuration.area”的值替换。请参阅方法org.eclipse.equinox.internal.p2.core.Activator.buildLocation(字符串、URI、布尔值、布尔值)。jvm的系统属性'eclipse.p2.data.area'的值始终是'@config.dir/./p2'。我想这会很有帮助-尽快尝试。你知道如果这个支持是最近添加的,它会在3.6.x中工作吗?上一次我放弃了,结果得到了糟糕的绝对路径。@inger是的,它应该适用于3.6,至少根据一些变量的工作原理,例如,
osgi.install.area
。其他变量如
osgi.configuration.area
未解析。