Maven + Tycho,如何添加Maven依赖项

9
我们有一个使用Maven和Tycho构建的Eclipse插件。然而,目前我们仍然通过一堆手动添加的JAR文件提供所有项目依赖项,而不是通过Maven。这是由于以下原因:(1)依赖项在标准的Eclipse更新站点中不可用(至少不是当前版本),(2)依赖项不可用作包。其中最大部分的依赖项是Selenium库(API、远程、特定于浏览器的库及其传递依赖项,如Guava等)。
我曾经浪费了几个小时,在我们的Maven构建中尝试拉取那些依赖项。 按照this SO问题的建议,我尝试了p2-maven-plugin,创建了一个包含我们依赖项的更新站点,并将其添加到我的Eclipse目标平台。然而,在运行时,跨不同JAR引用的类无法加载(我认为,根据我非常有限的OSGi知识,这是因为MANIFEST.MF文件中缺少某些必要信息)。以下是一个示例,当尝试创建一个使用DesiredCapabilities类(两个类在不同的bundle中)的RemoteWebDriver时遇到的问题:
Exception in thread "Thread-8" java.lang.NoClassDefFoundError: org/openqa/selenium/remote/DesiredCapabilities
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:243)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:126)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:153)
    …
Caused by: java.lang.ClassNotFoundException: org.openqa.selenium.remote.DesiredCapabilities cannot be found by org.seleniumhq.selenium.remote-driver_2.45.0
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:439)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:352)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:344)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:160)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

当使用p2-maven-plugin时,我还需要注意什么?相关的pom.xml部分如下所示:

<plugin>
    <groupId>org.reficio</groupId>
    <artifactId>p2-maven-plugin</artifactId>
    <version>1.1.1-SNAPSHOT</version>
    <executions>
        <execution>
            <id>default-cli</id>
            <configuration>
                <artifacts>
                    <artifact>
                        <id>org.seleniumhq.selenium:selenium-remote-driver:2.45.0</id>
                    </artifact>
                </artifacts>
            </configuration>
        </execution>
    </executions>
</plugin>

也许你无法解决这些依赖关系,因为p2插件仅充当目标平台?在运行时,这些构件并不存在。 - LppEdd
3个回答

14

无法让它正常工作,所以我们现在使用 maven-dependency-plugincopy-dependencies,在 Maven 的 initialize 阶段执行,以获取所有必要的依赖项(与我最初的感觉相反,这可以与 eclipse-plugin 打包和“先放置清单”方法结合使用)相关部分如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.10</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>initialize</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <includeScope>runtime</includeScope>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

接下来,Maven依赖项将被复制到target/dependency目录中。

唯一的小问题是:如果更新了Maven依赖项的JAR文件名称更改(例如commons-io-2.4.jar变成commons-io-2.5.jar),则需要手动更新MANIFEST.MF中的Bundle-ClassPath

[编辑] 关于上面的最后一句话,可以通过以下选项方便地去除版本号:<stripVersion>true</stripVersion>。这意味着,上述库将重命名为commons-io.jar,因此无需在版本号更改时更新路径。


谢谢你的回复。但我不确定是否需要过滤掉所有随着Maven依赖“.jar”一起的传递性依赖项,以便将其包含在p2站点中。 - reyman64
FYI:在此期间,我不得不进一步将相应的项目模块化。因此,我必须走极其令人沮丧的道路,并使用maven-jar-plugin将非OSGi依赖项转换为OSGi包。 这项任务非常繁琐,让我花费了一个周末的工作时间。最大的问题是:许多错误只会在应用程序启动期间或甚至在应用程序运行时出现,当找不到所需的软件包时(这是“更好”的问题),或者更糟糕的是:类无法找到或在软件包之间不兼容。 - qqilihq
在我们的情况下,使用maven-jar-plugin创建的捆绑包包含所有传递依赖项,但有一些例外(用于API的JAR、大型共享库,如Guava等)。确定要排除哪个软件包主要是由上述问题(交互捆绑时的类不兼容性)或经济因素(不要在每个捆绑包中包含大量传递性)所驱动。最理想的方式是为每个(传递)依赖项具有OSGI兼容的捆绑包依赖关系。但很明显,在现实中并非如此。@reyman64 - qqilihq
感谢 @qqilihq 的澄清,我在这里也遇到了类似的问题,涉及到传递依赖和 Tycho:http://stackoverflow.com/questions/41213928/transitive-dependencies-not-resolved-with-maven-dependency-and-tycho-pomconsider - reyman64

0

0

我也使用Maven和Tycho构建了一个Eclipse插件。我遇到了同样的问题:捆绑包org.eclipse.team.svn.coreorg.eclipse.team.svn.ui在标准的Eclipse更新站点中不可用。

也许你可以尝试这个方法来解决这种问题:

  1. Dependencies中,找到Automated Management of Dependencies框。
  2. 使用Add...添加所需的插件。
  3. 选择分析代码并通过Import-Package将依赖项添加到MANIFEST.MF中。
  4. 点击Add Dependencies,以便在附近的Imported Packages框中找到所需的包。

然后你就可以运行Maven构建了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接