我是一个非常严格控制的组织,绝对不允许访问外部存储库。
我想使用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组,如下所述:
在这里
Disable Maven central repository
在这里
http://www.sonatype.com/books/nexus-book/reference/maven-sect-single-group.html
2)运行mvn install或compile或者其他什么,以便它抓取依赖项。
之后,我不确定它是如何起作用的。以某种方式告诉maven在我当地的一个Nexus存储库中镜像外部组?我想我会试试并回来并发布我的解决方案,如果成功的话。在此期间,请随时评论或建议。
答案 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 / thirdpartycp *
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确实依赖于管理复杂的插件依赖关系,所以我想我会让它自己管理事物的这个方面。
如果有人就如何更好地简化这一过程提出建议,我会全力以赴。