Maven私有远程仓库设置

29
我正在为我们的团队设置一个私有远程仓库。现在,当我尝试执行“mvn compile”时,它会在“~/.m2”中搜索依赖项。如果没有找到,它将访问远程私有仓库。如果依赖项在这里仍然不存在,则去中央仓库查找。在编译之前,我必须将所有依赖项与校验和和元数据一起放入我们的私有(和远程)仓库中。
当我们需要一个artifact(例如spring-mvc)时,我们需要将其放入远程私有仓库中,并包含该artifact的所有依赖项(spring-mvc)。在这种情况下,“spring-mvc”从我们的远程私有仓库下载。但是,“spring-mvc”的依赖项不会从我们的远程私有仓库下载。它们将从中央仓库下载。
现在我想做的是 -
配置一个私有远程仓库“R”,使我不必手动将所有依赖项放入其中。当发出“mvn compile”命令时,首先在“~/.m2”中搜索依赖项。如果未找到依赖项,则访问私有远程仓库'R'。如果在'R'中找到依赖项,则“~/.m2”将从'R'获取它。如果在'R'中未找到依赖项,则会从中央仓库下载这些依赖项,并将它们保存在'R'中以供今后使用。此后,“~/.m2”将从“R”获取它们。在这里,我不需要手动将依赖项放入我们的远程私有仓库'R'。
“~/.m2”将从远程私有仓库'R'获取“spring-mvc”的所有依赖项(这是我的项目pom.xml中的主要依赖项),而“R”将从相应的中央仓库中获取它们。
有没有人可以提供一些方法/教程来满足上述两个目标?先谢谢了。

编辑:我已经尝试了Nathaniel Waisbrot的答案和nexus-2.7.0-06-bundle。经过数小时的努力,我成功地安装了它,但是只有在使用jre-7时才能确保启动nexus。但是我们的项目是使用JDK-6部署的,我们不想更改当前的jre版本。对于jre-6,apache-archiva是可以工作的。但我不确定是否能够达到前一节中提到的所有目标。是否有任何archiva用户/专家可以告诉我是否可以实现前一节中的这些目标?


1
你是如何建立远程代码仓库的?你使用的是哪个产品? - Behe
3
你试图做的似乎是 Sonatype Nexus 设计的工作方式。请参考该书了解更多细节:http://books.sonatype.com/nexus-book/reference/ - Mark O'Connor
1
请分享您的Maven配置(如果在pom.xml中声明了存储库,则包括settings.xml和pom.xml)。问题不是由于Archiva,而可能是您如何配置Maven来使用它。 - Olivier Lamy
3个回答

45

我已经设置了 nexus 以镜像我的Maven本地仓库(位于~/.m2/repository.),由于这篇文章仍然被很多人访问,我认为如果我分享一下我如何配置nexus作为仓库管理器,对其他人会有所帮助。这个过程在Ubuntu 12.04完美地运行。以下是步骤 -

1. 下载nexus-2.11.1-01-bundle.tar.gz或最新版本的Nexus OSS。

2. 将tar文件解压到您的主目录中-

$ tar -xvf nexus-2.11.1-01-bundle.tar.gz

现在你会得到两个目录 - nexus-2.11.1-01sonatype-work,它们位于你的主目录下。

3. 将这两个目录复制到/usr/local/目录中(它们也可以复制到其他地方) -

$ cp -r nexus-2.11.1-01 /usr/local/
$ cp -r sonatype-work /usr/local/
与nexus相关的可执行文件/配置文件存储在nexus-2.11.1-01目录中,pom.xml中提到的jar文件存储在sonatype-work目录中。
这些jar文件是您的~/.m2/repository的镜像。第一次发出mvn package命令时,所有jar都将存储在此处。然后,当您再次发出mvn package命令时,所有jar将从nexus存储库中下载,而不是从中央存储库中下载。

4. 转到/usr/local/目录 -

$ cd /usr/local/  

5. 创建到nexus-2.11.1-01的链接 -

$ sudo ln -s nexus-2.7.0-06 nexus

6. 现在要运行nexus,请在终端中输入以下命令 -

$ bash nexus/bin/nexus console  

这里将nexus与您的控制台连接在一起。如果您关闭控制台,则nexus服务器将被终止。当您尝试在Ubuntu服务器上运行nexus时,可以使用screen

注意:尝试使用上述命令运行nexus时可能会出现2个问题。如果没有发现任何问题,请跳过下面的两个步骤(步骤7和8)。

7.第一个问题可能是由于权限不足而引起的。阅读错误消息并采取必要的措施。但作为快速解决方案,您可以执行以下操作 -

$ sudo chmod -R 777 nexus-2.11.1-01/
$ sudo chmod -R 777 sonatype-work/

8. 如果您使用的任何jdk版本低于Java 7,则可能会显示以下错误消息 -

wrapper | 启动JVM... wrapper | JVM在加载应用程序时退出。 jvm 1 | "main"线程中的异常 java.lang.UnsupportedClassVersionError: org/sonatype/nexus/bootstrap/jsw/JswLauncher:不支持的major.minor版本51.0

在这种情况下,请使用jdk7运行第6步中提到的命令。在Ubuntu上很容易做到。假设您有两个jdk-jdk6和jdk7。您的项目在jdk6上运行。然后,仅为运行nexus,您可以从终端执行此操作(假设您的jdk7位于/usr/lib/jvm/jdk1.7.0_45目录中)-

$ export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_45
$ export PATH=$JAVA_HOME/bin:$PATH  

9. 现在在浏览器中输入地址 - http://localhost:8081/nexus/。如果步骤1到6(如果发生错误则为步骤1到8)都完美执行,您将成功找到登录界面。默认的登录用户名是 - admin,密码是 - admin123

10. 停止Nexus。只需关闭终端或在第6步的终端上按Ctrl+C即可。在您的~/.m2目录中创建一个名为-settings.xml的空文件。将以下内容复制到此settings.xml文件中:

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

    <profiles>
        <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>
    <!--make the profile active all the time -->
        <activeProfile>nexus</activeProfile>
    </activeProfiles>
</settings>

11. 接下来在你的项目的 pom.xml 文件中添加以下这些行:

<distributionManagement>
    <snapshotRepository>
        <id>my-snapshots</id>
        <name>My internal repository</name>
        <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
    </snapshotRepository>

    <repository>
        <id>my-releases</id>
        <name>My internal repository</name>
        <url>http://localhost:8081/nexus/content/repositories/releases</url>
    </repository>
</distributionManagement>

2
非常好的指南,谢谢。不幸的是,Nexus不完全支持ARM(包装器问题),因此无法在ARM上运行。尽管如此,对于详细的指南点赞。 - Dave

9
Sonatype Nexus可以满足你的所有需求,只需要很少的配置,并且具有良好的界面。在问题“Maven Internal Repository, Is it Really This Hard?”下有一些关于基本设置的详细信息。
基本上,您可以将Nexus设置为缓存库:您的Maven客户端仅会访问内部存储库。当内部存储库找不到构件时,它会去Central(或您定义的任何其他外部存储库)获取并存储以供以后使用。
这很酷,因为如果您想从自由抓取任何依赖项的环境过渡到受限环境,Nexus使其变得容易。您可以将其设置为从中央拉取,从干净的机器上运行构建(强制Nexus摄入所有当前的中央依赖项),然后关闭代理存储库功能(以便任何新/更改的依赖项都将由devops管理)。

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接