2011-12-21 109 views
2

我们正在尝试管理由多个Eclipse插件组成的项目。如何使用Eclipse,Maven和Jenkins管理第三方jar依赖项?

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

在本地,在Eclipse中,我们将库检出到工作区中,并在Eclipse项目的类路径中引用。插件清单并未明确说明对bpmn2的依赖关系。哪些在本地工作...

我们尝试使用Jenkins进行持续集成。多插件项目是使用Maven tycho插件使用Maven和多个POM文件进行管理的。

问题是,Maven不关心本地存在的库bpmn2(当然)。因此,我们认为使用Maven安装:安装到安装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/ 

,并与该库

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

会工作的依赖项调整相应的POM。但事实并非如此。

的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 

有人可以帮忙吗?

回答

5

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

我使用Nexus from Sonatype

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

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

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

为了公平起见,有一款名为Artifactory的竞争产品。你可以看一下这里 - >http://www.jfrog.com/products.php

+0

将这个仓库服务器能够使用本地存储库,并与它的工作? 另外,如果我想让它在Jenkins上工作,是否有更简单的解决方案? – danowar 2011-12-21 13:58:05

+0

@danowar。 1)您的本地存储库实际上是否遗漏了maven central或intranet服务器产生的文件。 2)你可以设置一个构建步骤,在Jenkins构建期间将第三方jar安装到本地存储库,但对我而言,这听起来比设置此服务器一次并忘记它更复杂。 – 2011-12-21 16:14:34

0

如果您不能使用的Nexus,您可以使用范围系统

Dependency Scopes

系统:这种依赖关系需要一些阶段你的 项目的生命周期,但是是 系统特定的。 使用此范围 是不鼓励:这被认为是 “先进”之类的功能,应该 当你真正了解 所有其使用的后果, 它是非常难,如果不 实际上不可能只使用量化。 根据定义,此范围会使您的 构建不可移植。在某些边缘情况下可能需要 。系统范围包括 <systemPath>元素,该元素指向 这个 依赖于本地机器的物理位置。它是 因此用于指某些工件 预计将出现在给定的 本地机器不在存储库中; ,其路径可能不同 机器对机器。例如,systemPath 元素可以参考其路径中的变量:${JAVA_HOME}

您可以

使用它要小心,使用这大概让你构建不便于携带。

+0

永远不要使用系统范围导致产生许多问题......并根据特定的机器进行构建.... – khmarbaise 2011-12-21 11:57:24

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>