我希望以编程方式确定我的 RCP 产品的版本。
我找到了返回 IProduct 对象的 Platform.getProduct() 方法。但是,这没有版本详细信息。我可以导航到 getDefiningBundle 对象,但它只有插件项目的版本 ID,而不是 .product 文件中的版本号。
欢迎任何提示。
最终发现您可以查询 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;
}
您好,此代码可能会帮助您获取产品文件的版本
IProduct product = Platform.getProduct();
Version version = product.getDefiningBundle().getVersion();
正如@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 魔法。