【问题标题】:Maven + Tycho, adding Maven dependenciesMaven + Tycho,添加 Maven 依赖
【发布时间】:2016-03-31 15:22:29
【问题描述】:

我们有一个使用 Maven 和 Tycho 构建的 Eclipse 插件。现在 但是,我们仍然通过一堆手动提供所有项目依赖项 添加 JAR 文件而不是 Maven。原因如下: (1) 依赖项不能通过标准的 Eclipse 更新站点获得(至少 不在当前版本中),(2)依赖项不能作为包提供。

这些依赖关系中最大的部分是 Selenium 库(API、Remote、 特定于浏览器的库及其传递依赖项,例如 Guava 等)

我已经浪费了几个小时,试图在我们的 Maven 构建过程中提取这些依赖项。 在this SO 问题之后,我尝试了p2-maven-plugin,创建了一个更新 包含我添加到我的 Eclipse 目标平台的依赖项的站点。然而, 在运行时,不能跨不同 JAR 引用的类 加载(我假设,根据我非常有限的 OSGi 知识,因为一些 MANIFEST.MF 文件中缺少必要的信息)。这是一个例子 的问题,当试图创建一个RemoteWebDriver,它使用 DesiredCapabilities 类(两个类在不同的包中):

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>

【问题讨论】:

    标签: java eclipse maven dependencies tycho


    【解决方案1】:

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

    <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

    只有小问题:MANIFEST.MF 中的 Bundle-ClassPath 需要手动更新,以防更新 Maven 依赖项时 JAR 文件的名称发生更改(例如,commons-io-2.4.jar 变为 commons-io-2.5.jar)。

    [编辑] 重新审视上面最后一句话的答案:版本号可以通过以下选项方便地剥离:&lt;stripVersion&gt;true&lt;/stripVersion&gt;。这意味着,上面的库将被重命名为commons-io.jar,因此版本号更改时不需要更新路径。

    【讨论】:

    • 谢谢。但我不知道是否需要过滤所有与 maven 依赖项“.jar”一起使用的传递依赖项以包含在 p2 站点中。
    • 仅供参考:同时,我必须进一步模块化相应的项目。所以我不得不走一条非常令人沮丧的道路,并使用maven-jar-plugin 将非 OSGi 依赖项转换为 OSGi 包。这项任务非常乏味,导致我工作超过一个周末。最大的问题:很多错误只在应用程序启动期间甚至在应用程序运行期间出现,当找不到所需的包时(这是“更好”的问题),或者更糟糕的是:找不到类或类之间不兼容包。
    • 在我们的例子中,使用 maven-jar-plugin 创建的包包含所有传递依赖项,一些例外(API 的 JAR、Guava 等大型共享库、... )。确定要排除哪个包,主要是由上述问题(交互束中的类不兼容)或经济因素(不包括每个束中的胖传递性)引起的。最优化的方法是,为每个(传递)依赖项提供 OSGI 兼容的捆绑包依赖项。但很明显,现实情况并非如此。 @reyman64
    • 感谢@qqilihq 的澄清,我在这里遇到了与传递依赖和tycho 类似的问题:stackoverflow.com/questions/41213928/…
    【解决方案2】:

    另一种可能性:

    一些 jar 文件可能会损坏(如果您使用的是 Eclipse,这是司空见惯的 hibernate-commons-annotations-4.0.1.Final.jar; invalid LOC header (bad signature)? )。要检查这种可能性,请尝试手动打开 jar 以查看是否正常。

    【讨论】:

      【解决方案3】:

      我还使用 Maven 和 Tycho 构建了一个 Eclipse 插件。我有同样的问题:捆绑包 org.eclipse.team.svn.coreorg.eclipse.team.svn.ui 无法通过标准 Eclipse 更新站点获得。

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

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

      然后您可以运行 Maven 构建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-24
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 2019-08-18
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多