下载maven项目依赖项以便稍后脱机构建

时间:2013-12-13 05:21:13

标签: java maven

我已经使用了maven一段时间以及开箱即用的设置,所以我明白它是什么,但我是maven设置中的新手。

我需要组织这样的工作流程:

  1. 开发人员编写java代码,使用来自互联网的一些依赖项。
  2. 开发人员承诺他的工作。
  3. TeamCity可以自动构建他的作品。没有任何手工工作,没有互联网。
  4. 我知道如何做到这一点:

    1. 开发人员使用maven。 “common”目录充当某些java项目的存储库。
    2. 工作完成后,开发人员将他的项目和公共目录提交到svn。
    3. TeamCity从svn更新项目和公共目录并运行“mvn package”。任何需要来自公共目录。无需担心互联网连接和启动连接或其他回购服务。
    4. 我的问题是: 如何在文件系统上使用简单目录作为某些项目的代理存储库? 请告诉我如何实现这个想法或给我另一个想法来实现这样的工作流程。

      我可以提交本地存储库,但存在一些限制:

      1. 本地repo zip工件。如果我对它做了很少的改动 - 整个缓存文件必须上传到svn或从svn下载。这需要很长时间。
      2. 所有项目的本地回购商店工件。我只希望某些项目使用此repo,因为开发人员不想检查更改并过滤未使用的依赖项。
      3. 我通过在repo url中编写“file:// testRespoDir”来测试本地目录以部署项目,但是我无法理解如何使这个目录代理项目的所有远程工件(项目不能使用本地仓库和只使用公共目录。

4 个答案:

答案 0 :(得分:4)

我找到了简单而完美的解决方案: POM包括2个存储库:

<repositories>
    <repository>
        <id>commonDep</id>
        <name>common dependency</name>
        <url>file://../common/repository</url>
    </repository>
    <!-- it used when collect dependencies before commit. If developer already download dependency, get it from local repo, save traffik and time -->
    <repository>
        <id>localPlugins</id>
        <name>local plugins</name>
        <url>file://${user.home}/.m2/repository</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>commonDep</id>
        <name>common dependency</name>
        <url>file://../common/repository</url>
    </pluginRepository>
    <!-- it used when collect dependencies before commit. If developer already download dependency, get it from local repo, save traffik and time -->       
    <pluginRepository>
        <id>localPlugins</id>
        <name>local plugins</name>
        <url>file://${user.home}/.m2/repository</url>
    </pluginRepository>
</pluginRepositories>

当开发人员打开项目时,他按照这样的顺序使用本地,公共和中央存储库。它节省了他的流量。当他完成工作时,他打电话给脚本:

mvn dependency:go-offline -Dmaven.repo.local=../common/repository

项目的所有当前依赖项从其默认本地存储库复制到公共存储库。然后开发人员提交常见。

当我们在teamcity上运行构建时,我们签出项目并使用common并运行它。没有互联网连接,但所有依赖项都存在于公共存储库中。

答案 1 :(得分:1)

是的,你可以亲自做到这一点,我不会推荐它,特别是如果你使用的是SNAPSHOT,但你应该可以。

所以你想要做的就是创建一个网络驱动器(我不知道你是在Windows上还是linux上,但这并不重要。)

然后将该网络驱动器安装在需要它的所有系统上。

然后在maven配置文件中指定本地maven repo位置:

    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                      http://maven.apache.org/xsd/settings-1.0.0.xsd" >

       <localRepository>c:/mvn-repo/</localRepository>
        ...
   </settings>

c:/ mvn-repo / 替换为您要使用的网络驱动器上的目录的路径。

您可以将此配置放置在不同的位置,但我建议将其放在生成@ $ {MAVEN_HOME} /conf/settings.xml的根配置文件中。

您需要在每台使用maven的计算机上指定。

然后应该这样做,所有你的maven运行时间将共享相同的本地回购。

那么如何使用不同的目录来绕过不同的项目呢?这是一个棘手的问题,您可以在网络驱动器上使用不同的目录,并通过将其指定为运行时属性来更改localRepository变量@运行时。

mvn -Dmaven.repo.local=$HOME/.my/other/repository clean install

这样你就可以很好地将一个网络驱动器与每个项目的目录分开,然后只需指定变量@运行时间来设置要使用的本地存储库。

答案 2 :(得分:1)

您建议的流程不会扩展。我宁愿设置中央存储库的本地企业镜像,并让开发人员和自动化服务器(teamcity等)使用它。设置简单,易于维护,易于跟踪第三方软件的依赖性并设置限制。

答案 3 :(得分:0)

我想尝试这样的解决方案:

  1. 将存储库文件:// testRespoDir添加到POM。
  2. 在pom中有一个init插件,它将项目依赖项复制到这个repo,如果那里不存在这样的依赖项。
  3. 在teamcity服务器上禁用Central。
  4. 只有一个问题 - 哪个插件可以这种方式复制依赖项?