【问题标题】:How to create a p2 repository from an existing osgi bundle?如何从现有的 osgi 包创建 p2 存储库?
【发布时间】:2013-08-18 22:38:56
【问题描述】:

我尝试在我的 Ecipe-RCP 应用程序中使用我的旧代码。我使用了所有带有依赖项的旧 maven 项目,并使用 maven-bundle-plugin 创建了一个 osgi 包。

现在我把所有东西都包装在一个新的 osgi jar 中。

如何从这个 OSGi jar 创建一个 p2 更新站点以与 Tycho 和 Eclipse 目标平台一起使用?

我试过了:https://docs.sonatype.org/display/TYCHO/How+to+make+existing+OSGi+bundles+consumable+by+Tycho(见web archive

发布 P2 存储库

先决条件:

  1. 首先,我们将所有 bundle jar 复制到 /plugins 目录中
  2. 然后我们执行
  %ECLIPSE_HOME%\eclipsec.exe -debug -consolelog -nosplash -verbose -application
        org.eclipse.equinox.p2.publisher.FeaturesAndBundlesPublisher
        -metadataRepository file:/<BUNDLE_ROOT>/repo
        -artifactRepository file:<BUNDLE_ROOT>/repo
        -source <BUNDLE_ROOT> -compress -publishArtifacts
  1. 结果是一个 P2 存储库,其中包含 /repo 下的所有 OSGi 包。注意 repo 目录中生成的 P2 元数据文件 artifacts.jar 和 content.jar。

通过 HTTP 使新的 P2 存储库可用

/repo 中的 P2 存储库已经完成,我们只需通过 HTTP 使其可用,以便全局引用。

这可以使用任何 HTTP 服务器(例如 Apache)来完成。在我们的例子中,我们选择将它部署在 Tomcat 上,因为我们已经有一个 Tomcat 用于其他目的,例如 Hudson 等。

在运行tomcat的主机上,将/repo的内容复制到/webapps/

从现在开始,您可以在 pom.xml 中引用这个 P2 存储库

<repository>
  <id>tomcat-p2</id>
  <layout>p2</layout>
  <url>http://<TOMCAT_HOST>:<TOMCAT_PORT>/<YOUR_REPO_DIR></url>
</repository>

如果我将生成的文件放在网络服务器上,eclipse 不会将其识别为“软件站点”。

如何在不使用 Eclipse UI 的情况下从现有的 osgi 包创建 p2 软件站点,该过程必须在我的构建服务器的后台运行。

有没有办法使用 Maven (Tycho)/Gradle 从现有的 osgi 包自动创建 p2 更新站点?

【问题讨论】:

    标签: eclipse maven eclipse-rcp tycho p2


    【解决方案1】:

    我总是使用这两个命令来生成 p2 存储库:

    java -jar %ECLIPSE_HOME%\plugins\org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar -application org.eclipse.equinox.p2.publisher.FeaturesAndBundlesPublisher -metadataRepository file:/C:/repository -artifactRepository file:/C:/destination -source /C:/source -configs gtk.linux.x86 -compress -publishArtifacts
    

    c:/source 存放我的包的位置,然后

    %ECLIPSE_HOME%/eclipse -debug -consolelog -nosplash -verbose -application org.eclipse.equinox.p2.publisher.CategoryPublisher -metadataRepository file:C:/destination -categoryDefinition file:C:/source/category.xml
    

    C:/source 树是这样的

    source
     -- feaures
     -- plugins
     -- category.xml
    

    您将需要这个category.xml 文件来将您的捆绑包分类。这是分类的内容

    <?xml version="1.0" encoding="UTF-8"?>
    <site>
       <category-def name="all" label="P2 Repo"/>
       <iu>
          <category name="all"/>
          <query><expression type="match">providedCapabilities.exists(p | p.namespace == 'osgi.bundle')</expression></query>
       </iu>
    </site>
    

    根据您的 Eclipse 版本,您可能需要更改此文件的版本org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar

    【讨论】:

    • 如果使用第一个命令,将创建包含我的包的 artifacts.jar、content.jar 和插件目录。如果我在第一个命令之后使用第二个命令,如果我删除目标目录中的所有内容,第二个命令会生成一个 content.xml,而我首先使用第一个命令没有创建它?我想我错过了什么?以及如何防止窗户关闭我无法阅读?
    • 是的,这是您的 p2 存储库。 eclipse 将打开并读取content.jar。您需要运行这两个命令,仅此而已。第二个命令将“发布”您的工件。无需删除所有内容
    • 如果 artifacts.jar、content.jar 和插件目录存在,为什么不生成 content.xml?如果我将 artifacts.jar、content.jar 和插件目录与我的捆绑包放在我的网络服务器上,eclipse 将找不到任何东西:(
    • 你不需要 content.xml
    • 我的网络服务器出现了某种问题。现在它可以工作了。非常感谢:)
    【解决方案2】:

    您也可以将这些 OSGi 包(和 maven 源附件)放到Package Drone,这是我目前正在开发的一个开源 OSGi 存储库。

    它允许您从 Maven Tycho、普通 Maven 或手动部署或手动上传 OSGi 工件,并让它从中创建 OSGi 元数据。它还允许使用 P2 访问此存储库,因此可以从 Eclipse PDE 或再次从 Maven Tycho 使用它。

    【讨论】:

    • 我知道这个回复已经过时了,但你是否知道是否可以使用包无人机创建一个由其他几个 p2 存储库组成的 p2 存储库(例如 Subclipse + JRebel + DBeaver P2-存储库都捆绑到一个 p2 存储库中,我可以粘贴到工件中)?
    【解决方案3】:

    使用这种方法,由于缺少属性,p2-repository 的内容不会变得可见。将 p2.inf 添加到 META-INF 中,其中包含: properties.0.name = org.eclipse.equinox.p2.type.group properties.0.value = true

    然后生成的 content.xml 包含这个属性,IUGroupQuery 返回这个单元。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 2019-02-14
      • 1970-01-01
      • 2013-11-29
      • 2023-03-17
      • 2015-09-29
      • 2013-07-24
      相关资源
      最近更新 更多