【问题标题】:How do I retrieve Eclipse RCP Product Version from IProduct如何从 IProduct 检索 Eclipse RCP 产品版本
【发布时间】:2012-09-29 09:57:51
【问题描述】:

我希望以编程方式确定我的 RCP 产品的版本。

我找到了返回 IProduct 对象的 Platform.getProduct() 方法。但是,这没有版本详细信息。我可以导航到 getDefiningBundle 对象,但它只有插件项目的版本 ID,而不是 .product 文件中的版本号。

欢迎任何提示。

【问题讨论】:

  • 我不确定该版本是否包含在导出的产品中。从之前的讨论中,我记得最简单的似乎是在其他地方定义了版本,并使用构建工具将版本包含在 java 类中并更改 .product 文件...

标签: eclipse rcp


【解决方案1】:

最终发现您可以查询 p2 产品 IU 以检索已安装产品的版本。我在自定义启动处理程序中执行此操作,并且有很多空保护,因为我不完全确定在开发环境启动配置中可以使用多少这个 API。你可能会很乐意删除那些!我认为您可能可以为特定产品 IU 构建一个 P2 查询,而不是像我一样遍历所有产品。很确定也可以在不使用 ProvisioningUI 的情况下获取活动配置文件,但这对我来说已经足够了。

import org.eclipse.equinox.p2.core.IProvisioningAgent;
import org.eclipse.equinox.p2.engine.IProfile;
import org.eclipse.equinox.p2.engine.IProfileRegistry;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.operations.ProvisioningSession;
import org.eclipse.equinox.p2.query.IQuery;
import org.eclipse.equinox.p2.query.IQueryResult;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.eclipse.equinox.p2.ui.ProvisioningUI;

private org.eclipse.equinox.p2.metadata.Version getProductVersion() {
    ProvisioningUI provisioningUI = ProvisioningUI.getDefaultUI();
    if (provisioningUI == null) return null;

    String profileId = provisioningUI.getProfileId();
    ProvisioningSession session = provisioningUI.getSession();
    if (profileId == null || session == null) return null;

    IProvisioningAgent provisioningAgent = session.getProvisioningAgent();
    if (provisioningAgent == null) return null;

    IProfileRegistry registry = (IProfileRegistry) provisioningAgent.getService(IProfileRegistry.SERVICE_NAME);
    if (registry == null) return null;

    IProfile profile = registry.getProfile(profileId);
    if (profile == null) return null;

    IQuery<IInstallableUnit> iuProductQuery = QueryUtil.createIUProductQuery();
    IQueryResult<IInstallableUnit> result = profile.query(iuProductQuery, null);
    if (result == null) return null;

    for (IInstallableUnit productIU : result) {
        if (PRODUCT_ID.equals(productIU.getId())) {
            return productIU.getVersion();
        }
    }

    return null;
}

【讨论】:

  • 嘿@stewart-francis - 太好了。谢谢!可悲的是,我现在忘记了为什么我想知道制作版本,Doh!
【解决方案2】:

您好,此代码可能会帮助您获取产品文件的版本

IProduct product = Platform.getProduct();

Version version = product.getDefiningBundle().getVersion();

【讨论】:

  • 为了提高答案(和问题)的质量,您可以通过选择代码并单击文本输入区域上方的 {} 按钮将代码格式化为代码片段,或者通过缩进每个一行四个空格。如果您只想格式化一行的一部分,您可以像上面一样突出显示并单击,或者在要格式化的文本周围放置` 字符。
【解决方案3】:

正如@dystroy 所提到的,IProduct 中唯一可用的产品版本是定义/品牌捆绑包的版本。如果它们匹配,那么你就完成了。

如今,产品版本存储在产品 IU 中的 RCP 应用程序的 p2 配置文件中。

eclipse -noSplash \
-application org.eclipse.equinox.p2.director \
-metadataRepository \
file://$(pwd)/p2/org.eclipse.equinox.p2.engine/profileRegistry/SDKProfile.profile \
-list | grep ^org.eclipse.sdk.ide

返回org.eclipse.sdk.ide=4.2.2.M20121008-1100。但我不确定从当前运行实例的 p2 配置文件中提取 IU 所需的 p2 魔法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多