如何使用Eclipse,Maven和Jenkins管理第三方jar依赖?

时间:2011-12-21 11:07:45

标签: eclipse maven jenkins eclipse-plugin

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

一个插件依赖于第三方插件。它从名为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] 

问题是:

我们怎样才能更好地整合第三方图书馆? 我认为,本地类路径引用不是更好图像的最佳解决方案。是否每个为项目开发的人都应安装bpmn2库并仅使用清单中的依赖项?

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

/var/lib/jenkins/localRep

并且在将库安装到存储库之后,似乎创建的目录结构没问题。

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

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:5)

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

我使用Nexus from Sonatype

当您需要从远程位置(例如maven central)下载工件时,它可以充当代理,但它也可以设置存储库来存储非公共分布的工件。

这里详细记录了整个设置过程 - &gt; http://www.sonatype.com/books/nexus-book/reference/

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

公平地说,有一种名为Artifactory的竞争产品。你可以在这里阅读 - &gt; http://www.jfrog.com/products.php

答案 1 :(得分:5)

我有一个类似的场景,我需要在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>

答案 2 :(得分:0)

如果您无法使用Nexus,则可以使用范围系统

Dependency Scopes

  

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

您可以将其与

一起使用

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