【问题标题】:How do I manage a 3rd party jar dependency with Eclipse, Maven and Jenkins?如何使用 Eclipse、Maven 和 Jenkins 管理 3rd 方 jar 依赖项?
【发布时间】:2012-01-25 04:58:17
【问题描述】:

我们正在尝试管理一个由多个 Eclipse 插件组成的项目。

一个插件依赖于第 3 方插件。它从名为 bpmn2 的库中导入一个类。该库是一个 jar 文件,不包含在 Maven 远程存储库中。

在本地,在 Eclipse 中,我们将库签出到工作区并在 Eclipse 项目的类路径中引用。插件清单没有明确声明对 bpmn2 的依赖关系。哪个在本地有效...

我们尝试使用 Jenkins 进行持续集成。 Multi-Plug-in-Project 使用 Maven 和多个 POM 文件进行管理,使用 Maven tycho 插件。

问题在于 Maven 不关心本地存在的库 bpmn2(当然)。所以我们认为使用 Maven install:install 将 bpmn2 安装到本地 Maven 仓库

./mvn install:install-file -Dfile=/home/someUser/bpmn2/org.eclipse.bpmn2_0.7.0.201111021300.jar -DgroupId=org.eclipse.bpmn2 -DartifactId=bpmn2 -Dversion=0.7.0 -Dpackaging=jar -DlocalRepositoryPath=/var/lib/jenkins/localRep/ 

并使用库的依赖项来调整相应的 POM

<dependencies>
    <dependency>
      <groupId>org.eclipse.bpmn2</groupId>
      <artifactId>bpmn2</artifactId>
      <version>0.7.0</version>
      <type>jar</type>
    </dependency> 
  </dependencies>

会起作用的。但它没有。

Maven的输出是:

[ERROR] Cannot resolve project dependencies:
[ERROR]   Software being installed: modeltype.bpmn2 1.0.0.qualifier
[ERROR]   Missing requirement: modeltype.bpmn2 1.0.0.qualifier requires 'bundle org.eclipse.bpmn2 0.7.0' but it could not be found
[ERROR] 

问题是:

我们如何才能更好地集成 3rd 方库? 我认为,本地类路径引用不是更大范围的最佳解决方案。为项目开发的每个人都应该安装 bpmn2 库并且只使用清单中的依赖项吗?

我们在 Maven 上做错了什么?本地存储库是

/var/lib/jenkins/localRep

并且将库安装到存储库后,创建的dir结构似乎还可以。

/org/eclipse/bpmn2/bpmn2/0.7.0/bpmn2-0.7.0.jar

有人可以帮忙吗?

【问题讨论】:

    标签: eclipse maven jenkins eclipse-plugin


    【解决方案1】:

    最简单的解决方案是为您的公司设置一个存储库服务器,并通过该服务器代理您的所有呼叫。

    我使用Nexus from Sonatype。

    当您需要从远程位置(如 maven Central)下载工件时,它充当代理,但它还能够设置存储库以存储非公开分发的工件。

    整个设置过程在此处都有很好的记录 -> http://www.sonatype.com/books/nexus-book/reference/。

    请注意,该产品的开源版本非常好,足以满足您的目的。

    公平地说,有一个竞争产品叫 Artifactory。你可以在这里阅读 -> http://www.jfrog.com/products.php

    【讨论】:

    • 此存储库服务器是否能够使用本地存储库并使用它?另外,如果我只想让它在 Jenkins 上运行,有没有更简单的解决方案?
    • @danowar。 1)您的本地存储库真的不知道工件是来自 maven Central 还是来自 Intranet 服务器。 2)您可以设置一个构建步骤,在 Jenkins 构建期间将第 3 方 jar 安装到本地存储库,但对我来说,这听起来比设置此服务器一次并忘记它更复杂。
    【解决方案2】:

    如果你不能使用 Nexus,你可以使用范围 system :

    Dependency Scopes

    系统:在您的某些阶段需要此依赖项 项目的生命周期,但 系统特定的。 使用此范围 不鼓励:这被认为是 “高级”类型的功能,应该 只有当你真正了解时才使用 它使用的所有后果, 如果不是,这可能会非常困难 实际上无法量化。 这个范围根据定义呈现您的 构建非便携式。它可能是 在某些边缘情况下是必要的。这 系统范围包括 &lt;systemPath&gt; 指向的元素 这个的物理位置 对本地机器的依赖。它是 因此用来指代一些神器 预计会出现在给定的 本地机器不在存储库中; 并且其路径可能会有所不同 机器对机器。 systemPath 元素可以引用环境 路径中的变量:${JAVA_HOME} 例如。

    您可以将它与

    一起使用

    小心,使用它可能会使您的构建不可移植。

    【讨论】:

    • 永远不要使用系统范围会导致产生很多问题......并根据特定机器进行构建......
    【解决方案3】:

    我有一个类似的场景,我需要在 Maven Web 项目中包含一个第三方库(未加载到 maven 存储库中)。

    以下方法帮助我们使代码可移植。

    解决方案:

    在WEB_INF下创建了“lib”目录,如下:

    <<Project_Base_Dir>>/src/main/webapp/WEB-INF/lib
    

    将第三方 JAR 复制到 LIB 目录。

    更新了 POM.xml 以使用 SYSTEMPATH,如下所示:

    <dependency>
        <groupId>GROUP_ID</groupId>
        <artifactId>ARTIFACT_ID</artifactId>
        <version>VERSION</version>
        <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/<<JAR_FILENAME>></systemPath>
        <scope>system</scope>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 2019-11-06
      • 2013-10-12
      • 1970-01-01
      • 2020-09-14
      • 2013-05-20
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2011-04-07
      相关资源
      最近更新 更多