【问题标题】:Eclipse OSGI config: relative paths and/or @config.dir-like substitutions?Eclipse OSGI 配置:相对路径和/或类似@config.dir 的替换?
【发布时间】:2011-06-24 07:14:42
【问题描述】:

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

关于 config.ini 中支持哪些类型的变量有明确的规范吗?


@config.dir 似乎是支持的,内置的有引用,它总是作为典型例子被提及(例如this SO answer) 但是,查看 Eclipse help/Runtime Options 之类的文档,它提到了一些“符号位置”,例如 @user.home;然而,这似乎相当有限,不包括@config.dir。

甚至还挖掘了org.eclipse.osgi 的来源,但没有发现对此的引用(我确实找到了 LocationManager 及其对@user.dir & co 的硬编码变量替换)。 我可以以某种方式在那里引用任意系统属性吗?

这是@config.dir 的特殊情况,仅由P2 处理吗? 更新: 似乎是这种情况.. 查看 Eclipse SDK,关于 .. 配置对话框显示 @config.dir 未解析,可能由 Equinox 字面意思理解..

感谢任何提示。

【问题讨论】:

  • +1 我正在为这个问题开奖。我真的需要能够为我的 config.ini 中的 eclipse.p2.data.area 指定相对于安装目录而不是配置区域的路径。如果有人能告诉我该怎么做,请获得 200 个代表!
  • @pelotom,感谢您的支持 - 让我们希望.. 实际上,我非常相信我的问题没有准确的答案(这令人难以置信,但替换似乎在核心中硬编码).. 但是,因为您似乎对特定于 P2 的属性更感兴趣,它可能会得到更好的支持,即 @config.dir 似乎确实由 P2 配置处理专门处理 - 也许这不是唯一的。

标签: eclipse configuration osgi eclipse-rcp equinox


【解决方案1】:

来自 org.eclipse.core.runtime.adaptor.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$                                                                                           

【讨论】:

  • 谢谢克里斯-我找到了相同的列表(请参阅我的问题)。它似乎非常有限 - 所以想知道我是否错过了某些东西(例如系统属性或类似的 sg)。通过框架调试后,似乎希望不大。
  • 我也在 E​​quinox 新闻组eclipse.org/forums/… 上问了一个类似的问题 - 等待答案。
  • @inger:从源代码中可以清楚地看出这些是唯一受支持的选项。
  • 嗯,从仅查看 LocationManager 来看,是的,这很清楚 - 我也在几分钟内找到了它。但这并不能解释为什么当时支持@config.dir(正如我所说,我现在假设它是对 P2 的特殊处理,我认为这很奇怪)。我只是希望这个问题已经以其他方式解决,否则 osgi.java.profile 对于 RCP 开发似乎毫无用处。如果只是挂钩 ${system.properties} 而不是愚蠢的硬编码替换,那就太好了。
【解决方案2】:

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

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

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

【讨论】:

  • 当然我可以尝试一种解决方法,在其中创建 Eclipse 应该具有的属性,但这至少需要一个额外的启动器脚本,额外的 hacks.. 在此之后我仍然不确定我是否可以达到到 config.ini 中的该属性,作为其他属性定义的一部分。如果有一些 Eclipse 功能可以做到这一点,我真正感兴趣的是我错过了。
  • @inger,这绝对是 p2 的一个棘手问题。您会发现 @config.dir 在运行时被框架属性“osgi.configuration.area”的值替换。请参阅方法 org.eclipse.equinox.internal.p2.core.Activator.buildLocation(String, URI, boolean, boolean)。 jvm的系统属性'eclipse.p2.data.area'的值总是'@config.dir/../p2'。
【解决方案3】:

看看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 的情况下无法使用安装目录的相对路径。

【讨论】:

    【解决方案4】:

    您可以使用平台 URL (Platform URI scheme) 来实现此目的,即

    osgi.java.profile = platform:/config/java_profile.txt
    

    config.ini 中,将指向当前配置目录中的文件java_profile.txt

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

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

    【讨论】:

    • 我想这会有所帮助 - 尽快尝试。你知道如果最近添加了这个支持,它会在 3.6.x 中工作吗?上次我放弃并以讨厌的绝对路径结束..
    • @inger 是的,它应该适用于 3.6,至少根据 documentation
    【解决方案5】:

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

    从 Eclipse 3.8/4.2(2012 年 6 月)开始,您可以将 Java 属性和环境变量替换为您的 config.ini 文件 (Eclipse Bug 241192)。 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
    

    【讨论】:

    • 适用于某些变量,例如osgi.install.areaosgi.configuration.area 等其他变量未解析。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多