Maven Tycho无法找到我用maven-bundle-plugin创建的包

时间:2016-01-29 18:08:16

标签: java eclipse maven eclipse-plugin tycho

我继承了一个用Maven Tycho构建的大型Eclipse插件代码库。它有几个插件模块,两个功能,一个目标平台和一个更新站点。我已经使用Java多年了,但我对Eclipse插件开发和OSGi都很陌生。

我发现其中一个插件模块(我们称之为"核心")有一个" lib"带有少量第三方罐子的文件夹。我最初假设原作者只是懒惰,因为我希望看到那些与Maven依赖关系指定的人。我后来发现,将Maven依赖项放入Eclipse插件非常简单,在经过两周多的努力解决问题并在各种论坛上发布问题之后,我仍然无法让它运行起来。我今天意识到我没有试过SO帖子,所以我们走了。

在阅读了关于这个问题的更多信息之后,我得出结论,我需要定义一个新模块,我们将调用它" maventhirdparty",它会在pom中声明那些第三方依赖项,然后使用" maven-bundle-plugin"要生成一个有效的OSGi包,然后我需要将新包声明为原始"核心"束。

我已经完成了这一切。不幸的是,尽管生成的bundle和manifest看起来对我来说是正确的,但是当Tycho试图解决" core"模块,它简单地说它无法找到我宣布的新捆绑。我无法弄清楚如何生成任何其他诊断信息,只是说它无法找到它。

所以,这里有一些输出和文件摘录。

这是来自构建:

[INFO] Resolving dependencies of MavenProject: com.cisco.yangide:com.cisco.yangide.core:1.1.1-SNAPSHOT @ /home/opnfv/git/yangide/plugins/com.cisco.yangide.core/pom.xml
[INFO] {osgi.os=linux, osgi.ws=gtk, org.eclipse.update.install.features=true, osgi.arch=x86}
[ERROR] Cannot resolve project dependencies:
[ERROR]   Software being installed: com.cisco.yangide.core 1.1.1.qualifier
[ERROR]   Missing requirement: com.cisco.yangide.core 1.1.1.qualifier requires 'bundle com.cisco.yangide.maventhirdparty 1.1.1' but it could not be found
[ERROR] 
[ERROR] See http://wiki.eclipse.org/Tycho/Dependency_Resolution_Troubleshooting for help.
[ERROR] Cannot resolve dependencies of MavenProject: com.cisco.yangide:com.cisco.yangide.core:1.1.1-SNAPSHOT @ /home/opnfv/git/yangide/plugins/com.cisco.yangide.core/pom.xml: See log for details -> [Help 1]

这里是POM的新摘录#e;第三方"模块:

  <artifactId>com.cisco.yangide.maventhirdparty</artifactId>
  <packaging>bundle</packaging>
  <version>1.1.1-SNAPSHOT</version>

  <dependencies>
  <dependency>
    <groupId>org.antlr</groupId>
    <artifactId>antlr4-runtime</artifactId>
    <version>4.0</version>
  </dependency>
  <dependency>
    <groupId>org.mapdb</groupId>
    <artifactId>mapdb</artifactId>
    <version>1.0.4</version>
  </dependency>
  <dependency>
    <groupId>org.opendaylight.yangtools</groupId>
    <artifactId>yang-model-api</artifactId>
    <version>0.6.1</version>
  </dependency>
  <dependency>
    <groupId>org.opendaylight.yangtools</groupId>
    <artifactId>yang-parser-impl</artifactId>
    <version>0.6.1</version>
  </dependency>
  </dependencies>

  <build>
<plugins>
  <plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <extensions>true</extensions>
    <configuration>
      <instructions>
    <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
    <Bundle-Version>1.1.1</Bundle-Version>
    <Embed-Dependency>
      antlr4-runtime, mapdb, yang-model-api, yang-parser-impl
    </Embed-Dependency>
    <Export-Package>org.opendaylight.yangtools.*, org.antlr.*, org.mapdb.*</Export-Package>
    <Embed-Transitive>true</Embed-Transitive>
    <Embed-Directory>jars</Embed-Directory>
    <_failok>true</_failok>
    <_nouses>true</_nouses>
      </instructions>
    </configuration>
  </plugin>
</plugins>

以下是生成的捆绑包中生成的清单的摘录:

Manifest-Version: 1.0
Bnd-LastModified: 1454085545792
Build-Jdk: 1.8.0_60
Built-By: opnfv
Bundle-ClassPath: .,jars/antlr4-runtime-4.0.jar,jars/mapdb-1.0.4.jar,jar
 s/yang-model-api-0.6.1.jar,jars/yang-parser-impl-0.6.1.jar
Bundle-DocURL: https://www.opendaylight.org
Bundle-License: https://www.eclipse.org/legal/epl-v10.html
Bundle-ManifestVersion: 2
Bundle-Name: com.cisco.yangide.maventhirdparty
Bundle-SymbolicName: com.cisco.yangide.maventhirdparty
Bundle-Vendor: OpenDaylight
Bundle-Version: 1.1.1
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: antlr4-runtime, mapdb, yang-model-api, yang-parser-imp
 l
Embed-Directory: jars
Embed-Transitive: true
Embedded-Artifacts: ...
Export-Package: ...
Import-Package: ...
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
Tool: Bnd-3.0.0.201509101326

这是&#34;核心&#34;的明显。模块:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: com.cisco.yangide.core
Bundle-SymbolicName: com.cisco.yangide.core;singleton:=true
Bundle-Version: 1.1.1.qualifier
Bundle-Activator: com.cisco.yangide.core.YangCorePlugin
Bundle-Vendor: Cisco Systems, Inc.
Require-Bundle: org.eclipse.core.runtime,
org.eclipse.jdt.core;visibility:=reexport,
org.eclipse.text,
org.eclipse.core.resources,
org.eclipse.core.filesystem,
com.cisco.yangide.maventhirdparty;bundle-version="1.1.1"
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
Export-Package: com.cisco.yangide.core,
com.cisco.yangide.core.buffer,
com.cisco.yangide.core.dom,
com.cisco.yangide.core.indexing,
com.cisco.yangide.core.parser,
com.cisco.yangide.core.model,
org.antlr.v4.runtime

我可以在这做什么?

更新

这是我当前的目标平台定义:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?pde version="3.8"?><target includeMode="feature" name="YANG IDE Target Platform" sequenceNumber="26">
<locations>
<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
<unit id="com.google.guava" version="15.0.0.v201403281430"/>
<unit id="com.google.guava.source" version="15.0.0.v201403281430"/>
<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/"/>
</location>
<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
<unit id="org.eclipse.rcp.sdk.id" version="4.5.1.M20150904-0015"/>
<unit id="org.eclipse.graphiti.feature.feature.group" version="0.12.1.v20150916-0905"/>
<unit id="org.sonatype.m2e.mavenarchiver.feature.feature.group" version="0.17.0.201502101659-signed-20150525172209"/>
<unit id="org.eclipse.emf.sdk.feature.group" version="2.11.1.v20150806-0404"/>
<unit id="org.eclipse.emf.compare.source.feature.group" version="3.1.1.201509120604"/>
<unit id="org.eclipse.graphiti.feature.tools.feature.group" version="0.12.1.v20150916-0905"/>
<unit id="org.eclipse.graphiti.sdk.feature.feature.group" version="0.12.1.v20150916-0905"/>
<unit id="org.eclipse.emf.compare.feature.group" version="3.1.1.201509120604"/>
<unit id="org.eclipse.sdk.ide" version="4.5.1.M20150904-0015"/>
<unit id="org.eclipse.graphiti.sdk.plus.feature.feature.group" version="0.12.1.v20150916-0905"/>
<unit id="org.eclipse.m2e.sdk.feature.feature.group" version="1.6.2.20150902-0002"/>
<unit id="org.eclipse.emf.compare.ide.ui.feature.group" version="3.1.1.201509120604"/>
<unit id="org.eclipse.gef.feature.group" version="3.10.1.201508170204"/>
<unit id="org.eclipse.m2e.feature.feature.group" version="1.6.2.20150902-0002"/>
<unit id="org.eclipse.gef.sdk.feature.group" version="3.10.1.201508170204"/>
<unit id="org.eclipse.jdt.feature.group" version="3.11.1.v20150904-0015"/>
<repository location="http://download.eclipse.org/releases/mars/"/>
</location>
<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
<unit id="org.sonatype.m2e.buildhelper.feature.feature.group" version="0.15.0.201206251206"/>
<repository location="https://repository.sonatype.org/content/repositories/forge-sites/m2e-extras/0.15.0/N/0.15.0.201206251206/"/>
</location>
</locations>
</target>

以下是&#34; target-platform-configuration&#34;的当前用法。来自父pom的插件:

  <plugin>
    <groupId>org.eclipse.tycho</groupId>
    <artifactId>target-platform-configuration</artifactId>
    <version>${tycho-version}</version>
    <configuration>
      <target>
    <artifact>
      <groupId>com.cisco.yangide</groupId>
      <artifactId>com.cisco.yangide.target-platform</artifactId>
      <version>1.1.1-SNAPSHOT</version>
    </artifact>
      </target>
      <environments>
    <environment>
      <os>linux</os>
      <ws>gtk</ws>
      <arch>x86</arch>
    </environment>
    <environment>
      <os>linux</os>
      <ws>gtk</ws>
      <arch>x86_64</arch>
    </environment>
    <environment>
      <os>win32</os>
      <ws>win32</ws>
      <arch>x86</arch>
    </environment>
    <environment>
      <os>win32</os>
      <ws>win32</ws>
      <arch>x86_64</arch>
    </environment>
    <environment>
      <os>macosx</os>
      <ws>cocoa</ws>
      <arch>x86_64</arch>
    </environment>
      </environments>
    </configuration>
  </plugin>

奇怪的是,在我继承的原始代码库中,&#34; target&#34;上面的元素被注释掉了。无论有没有这个,我都会运行这个版本,而且我看不出有什么区别。我猜它应该在那里,所以我把它留在了,但原作者可能比我更了解这一点。

关于给定的答案,我觉得这很神秘。您似乎在说,如果我有两个插件模块,我无法从一个引用另一个类,而无需将引用的bundle部署到某个地方的p2 repo。问题是,我已经在&#34; Require-Bundle&#34;中的应用程序中引用了其他捆绑包。一个或多个包的属性,这些模块构建正常,没有错误。

更新

请注意,我正在查看此问题的其他两种解决方法。

维护我用于此项目的nexus repo的人正在为MavenCentral工件设置p2镜像。他们有一些证书问题,但我觉得这将是最终的解决方案。

另一种可能性是用Gradle替换Maven,使用&#34; Wuff&#34;插入。从我读过的内容来看,Wuff将只使用maven依赖项并透明地将它们打包为OSGi包,这样就可以了。不幸的是,我发现Wuff的文档有些“原始”和#34;似乎并没有覆盖我的应用程序结构,尽管它可能只是假设我知道如何所有这一切都应该奏效。似乎没有任何方式可以提出有关此问题,因为作者没有回复我的问题或我的电子邮件。

更新

这里的文件只是摘录,但你可以看到(并克隆)整个项目,减去&#34; maventhirdparty&#34;模块及其引用,github。我的最新作品是关于&#34; forkmaster&#34;分支,但这方面没有变化。

1 个答案:

答案 0 :(得分:3)

我已经使用Eclipse多年了,我遇到了你正在描述的完全相同的问题。

事实上,tycho不会只是&#39;只是&#39;从maven reactor解决依赖关系,它实际上是从目标平台解析它们。您可能需要查看父pom文件以发现它,但很可能tycho被配置为使用您继承的确切目标平台。

看起来像

<plugin>
  <groupId>org.eclipse.tycho</groupId>
  <artifactId>target-platform-configuration</artifactId>
  <version>${tycho-version}</version>
  <configuration>
    <target>
      <artifact>
        <groupId>org.example</groupId>
        <artifactId>target-definition</artifactId>
        <version>1.0.0-SNAPSHOT</version>
      </artifact>
    </target>
  </configuration>
</plugin>

请参阅文档(https://wiki.eclipse.org/Tycho/Target_Platform)以供参考。 Tycho兼容目标平台应使用基于uri的p2存储库位置。另外,也可以在你的pom.xml中指定p2 uris。无论如何,您需要将工件放入p2存储库。我发现最好的方法是使用p2-maven-plugin(参见类似的详细示例:https://github.com/reficio/p2-maven-plugin)。您需要做的是使用p2 maven插件构建您的存储库(使用p2:站点目标),使其可访问http(提供该目录的jetty或nginx将正常工作),将其添加到您的目标平台,并且您和#39;重新完成。

p2-maven-plugin参考的这一部分解决了你的问题:

  

如果您的某些依赖项不是OSGi捆绑包或P2更新站点中不可用,则SIMPLY在p2-maven-plugin配置中定义它们,生成站点并使用jetty(或任何其他机制)使其可用。然后将公开站点的URL添加到目标平台定义。通过这种方式,您将在Eclipse RCP项目中拥有一致的,清单优先的依赖关系管理!

希望这会有所帮助,并且(更多)有趣的Eclipse开发!