将第三方依赖项部署到maven存储库的简便方法

时间:2011-10-20 14:08:49

标签: java deployment maven repository nexus

我是一个非常严格控制的组织,绝对不允许访问外部存储库。

我想使用Spring&我们的应用程序的Hibernate框架,并使用maven来解决依赖关系并构建项目。

我在本地服务器上建立了一个nexus“第三方”存储库,现在实际上是添加库的一部分。 Hibernate 3.6.7.Final附带以下jar:

./hibernate-testing.jar
./hibernate3.jar
./lib/required/commons-collections-3.1.jar
./lib/required/dom4j-1.6.1.jar
./lib/required/jta-1.1.jar
./lib/required/slf4j-api-1.6.1.jar
./lib/required/antlr-2.7.6.jar
./lib/required/javassist-3.12.0.GA.jar
./lib/jpa/hibernate-jpa-2.0-api-1.0.1.Final.jar
./lib/optional/c3p0/c3p0-0.9.1.jar
./lib/optional/swarmcache/swarmcache-1.0RC2.jar
./lib/optional/proxool/proxool-0.8.3.jar
./lib/optional/jbosscache/jbosscache-core-3.2.1.GA.jar
./lib/optional/oscache/oscache-2.1.jar
./lib/optional/infinispan/infinispan-core-4.2.1.CR1.jar
./lib/bytecode/javassist/javassist-3.12.0.GA.jar
./lib/bytecode/cglib/cglib-2.2.jar

Spring 3.0.6.RELEASE附带以下内容:

org.springframework.aop-3.0.6.RELEASE.jar                
org.springframework.jdbc-3.0.6.RELEASE.jar
org.springframework.asm-3.0.6.RELEASE.jar                
org.springframework.jms-3.0.6.RELEASE.jar
org.springframework.aspects-3.0.6.RELEASE.jar            
org.springframework.orm-3.0.6.RELEASE.jar
org.springframework.beans-3.0.6.RELEASE.jar              
org.springframework.oxm-3.0.6.RELEASE.jar
org.springframework.context-3.0.6.RELEASE.jar            
org.springframework.test-3.0.6.RELEASE.jar
org.springframework.context.support-3.0.6.RELEASE.jar    
org.springframework.transaction-3.0.6.RELEASE.jar
org.springframework.core-3.0.6.RELEASE.jar               
org.springframework.web-3.0.6.RELEASE.jar
org.springframework.expression-3.0.6.RELEASE.jar         
org.springframework.web.portlet-3.0.6.RELEASE.jar
org.springframework.instrument-3.0.6.RELEASE.jar         
org.springframework.web.servlet-3.0.6.RELEASE.jar
org.springframework.instrument.tomcat-3.0.6.RELEASE.jar  
org.springframework.web.struts-3.0.6.RELEASE.jar

据我所知,部署依赖项的两种首选方法是

1)设置一个pom;使用命令“mvn deploy”

2)对于个别罐子使用如此命令行:

 mvn deploy:deploy-file -Durl=file://C:\m2-repo \

                   -DrepositoryId=some.id \

                   -Dfile=your-artifact-1.0.jar \

                   [-DpomFile=your-pom.xml] \

                   [-DgroupId=org.some.group] \

                   [-DartifactId=your-artifact] \

                   [-Dversion=1.0] \

                   [-Dpackaging=jar] \

                   [-Dclassifier=test] \

                   [-DgeneratePom=true] \

                   [-DgeneratePom.description="My Project Description"] \

                   [-DrepositoryLayout=legacy] \

                   [-DuniqueVersion=false]

1)我知道我可以为整个hibernate项目创建一个pom,或者创建多个pom,我猜每个外部库都有1个pom。例如,cglib-2.2.jar可以是它自己的pom,因为我知道spring有一个类似的依赖,所以为了没有(2)x cglib(s),我有1个cglib然后包含它我的org.spring和org.hibernate poms中的依赖关系。

对于2)我想我可以编写一个shell脚本来读取文件列表并从某个地方解析另一个列表中的GAV信息并将它们转储到repo 1 by 1,然后每个jar将在我项目的POM中列为依赖项

这最后一部分让我感到困惑......如果我将整个Spring版本部署为1组 - org.Spring和Hibernate在另一个org.Hibernate中,依赖项之间是否会发生冲突(例如cglib)?

所以我想我的问题是:

将下载的Spring和Hibernate版本部署到我的本地nexus存储库所需的最简单,最快速,最省力的方法是什么,以便我可以在项目中快速使用它们? (无需在太多poms中列出太多依赖项。)


修改

对我想要的东西进行一点澄清。我有1个Nexus管理器在本地服务器上运行(可以访问Internet)。我希望能够从Internet存储库下载 运行Spring& s所需的所有依赖项。休眠。我只想 ONCE ,然后让他们坐在我的内部存储设备(Nexus)中,我想永远不会与中央交谈,jboss,spring或任何其他 PUBLIC 存储,直到我特定允许它。我希望能像开关那样打开和关闭它。

ON模式=“您可以从公共存储库获取依赖项”

关闭模式=“你不能连接到任何外部”

在我看来,通过以下方式可以实现这一目标:

在Nexus中

1)设置一个组

2)为您需要的每个外部存储库设置代理

3)将所有代理置于1组

开发工作站上的

(这是我不确定的部分)

1)编辑settings.xml以覆盖中心位置并将存储库指向本地nexus组,如下所述:

maven repository mirrors

在这里

Disable Maven central repository

在这里

http://www.sonatype.com/books/nexus-book/reference/maven-sect-single-group.html

2)运行mvn install或compile或者其他什么,以便它抓取依赖项。

之后,我不确定它是如何起作用的。以某种方式告诉maven在我当地的一个Nexus存储库中镜像外部组?我想我会试试并回来并发布我的解决方案,如果成功的话。在此期间,请随时评论或建议。

4 个答案:

答案 0 :(得分:4)

Nexus有一个采购功能,可以从外部严格控制您的回购中的内容,同时仍使用上游的原始poms。如果没有它们,您将丢失所有传递依赖性信息,并且很可能在将来破坏构建或运行时部署。

JFrog Artifactory具有类似的功能(可以定义包含/排除模式)免费。

答案 1 :(得分:1)

不确定这是否有帮助,但我们一直在使用codehaus的maven-proxy一段时间了。我建议运行代理,设置settings.xml文件(见下文),然后让mvn eclipse:evlipse通过缓存下载所有依赖项。您也可以手动填充缓存。然后,您可以调整缓存以专门为所需的包提供服务,而不是其他任何内容。

如果您获得了不需要的软件包,则需要在pom.xml个文件中添加排除项:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring</artifactId>
    <version>2.0.6</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

代理是一个在我们的dev框中运行的java应用程序。在我们的settings.xml文件中,我们有以下内容:

<settings>
 <mirrors>
    <mirror>
      <id>maven-proxy</id>
      <name>Maven-Proxy Mirror</name>
      <url>http://mvnproxy.some-host-name.com:9999/repository</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
    <mirror>
      <id>maven-proxy</id>
      <name>Maven-Proxy Mirror</name>
      <url>http://mvnproxy.some-host-name.com:9999/repository</url>
      <mirrorOf>plugins</mirrorOf>
    </mirror>
  </mirrors>
  ...

这是我们的启动脚本,我认为它不附带发布版本:

#!/bin/sh
umask 022
cd /var/www/maven-proxy
java -jar maven-proxy-standalone-0.2-app.jar maven-proxy.prop >| maven-proxy.log 2>&1 &
echo $! > mp.pid

答案 2 :(得分:0)

我会为这些项目重用现有的pom,以便有效地创建公共存储库的镜像。

答案 3 :(得分:-3)

想出来。

这是它的工作原理。我将从Nexus设置开始。

我们有2个“组”,其中包含以下存储库:

1)我们的回购(在我们的服务器上安装nexus)

第三方

-Releases

-Snapshots

2)外部代理

-Maven central

-Spring

-HIBERNATE

-etc。

在开发工作站上,我在conf / settings.xml(mvn的主设置文件)中有以下内容:2组,2个镜像,2个配置文件。看起来像这样:

<mirrors>
<mirror>
  <!--This sends everything else to nexus repo -->
  <id>nexus</id>
  <mirrorOf>*</mirrorOf>
  <url>http://<ip>:8081/nexus/content/groups/nexus</url>
</mirror>
 <mirror>
  <!--This sends everything else to /public -->
  <id>external</id>
  <mirrorOf>*</mirrorOf>
  <url>http://<ip>:8081/nexus/content/groups/external</url>
</mirror>
</mirrors>

 <profiles>
  <profile>
  <id>external</id>
  <!--Enable snapshots for the built in central repo to direct -->
  <!--all requests to nexus via the mirror -->
  <repositories>
    <repository>
      <id>central</id>
      <url>http://central</url>
      <releases><enabled>true</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </repository>
  </repositories>
 <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <url>http://central</url>
      <releases><enabled>true</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </pluginRepository>
  </pluginRepositories>
</profile>

<profile>
  <id>nexus</id>
  <!--Enable snapshots for the built in central repo to direct -->
  <!--all requests to nexus via the mirror -->
  <repositories>
    <repository>
      <id>central</id>
      <url>http://central</url>
      <releases><enabled>true</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </repository>
  </repositories>
 <pluginRepositories>
    <pluginRepository>
      <id>central</id>
      <url>http://central</url>
      <releases><enabled>true</enabled></releases>
      <snapshots><enabled>true</enabled></snapshots>
    </pluginRepository>
  </pluginRepositories>
</profile>
</profiles>

<activeProfiles>
<activeProfile>external</activeProfile>   
<activeProfile>nexus</activeProfile>
</activeProfiles>

工作流程是这样的。

Maven以先到先得的方式使用镜子。也就是说,如果您正在镜像*,那么无论您首先列出的是什么(第一个镜像),它都是唯一能够检查的东西。所以我所做的是,我将nexus(本地服务器)列为默认为镜像*的第一个repo。这样,它将被强制仅使用本地存储库中的包。如果包丢失会怎么样?我告诉maven使用“外部”镜子。我编辑

CONF / settings.xml中

并将外部视为第一个镜像。这将做的是告诉maven从外部存储库获取软件包并将它们缓存在nexus机器上的存储中。一旦我有了包,并且我看到构建过程有效,我会执行以下操作。

1)使nexus离线。

2)在nexus安装中,找到这个文件夹:

Sonatype的工作/关系/存储/

这是nexus缓存存储库包的地方。请注意,它不会按群组缓存它们,而是按单个存储库缓存它们。这将在一秒钟内变得很重要。既然我需要外部代理我需要的软件包,我需要通过它们,确保它们全部有效并将它们移动到nexus上的“第三方”分支。我执行以下操作(您可以编写一个shell脚本来执行此操作):

1)使nexus离线

2)每个外部代理

从sonatype-work / nexus / storage /到sonatype-work / nexus / storage / thirdparty

cp *

3)在线提供联系

4)在GUI右键单击第三方回购并执行:

a)重建元数据

b)修复指数

完成。

您现在可以在本地使用外部依赖项,从而可以控制对外部工件的访问。将存储库维护的角色委派给团队负责人或负责人可能是个好主意。因为第一次项目可能需要来自中心的东西而没有它,所以有人必须经历这个过程。


修改

有关插件主题的一点注意事项,我更改了conf / settings.xml文件以允许maven从中心抓取插件。所以在两个配置文件中都这样做:

<pluginRepositories>
<pluginRepository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2/</url>
  <releases><enabled>true</enabled></releases>
  <snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>

这不是100%最优,因为我没有完全控制maven在这里做什么,但看起来90%的maven确实依赖于管理复杂的插件依赖关系,所以我想我会让它自己管理事物的这个方面。

如果有人就如何更好地简化这一过程提出建议,我会全力以赴。