【问题标题】:separate local download and install repositories using maven?使用 maven 单独的本地下载和安装存储库?
【发布时间】:2016-02-17 08:58:53
【问题描述】:

我想不时从头开始重建我的项目结构,并希望清除已构建的存储库以执行此操作。但是,我不想从 Maven 中心和其他存储库中删除下载的文件。有没有一种简单的方法可以告诉 maven 将我构建的工件安装到单独的存储库中,即。除了用于存储下载的外部文件的那个吗?

不是在谈论deploy,只是mvn install

更新

我找到了一个替代解决方案,它只使用一个本地存储库来下载和自建的工件:自建的伴随着名为“maven-metadata-local.xml”的文件,所以我选择要清除的存储库目录现在基于该文件的存在...

【问题讨论】:

    标签: maven repository


    【解决方案1】:

    install 目标无法做到这一点。 maven-install-plugin 会将工件安装到用于从中获取下载的工件的同一本地存储库中。默认情况下,这是${user.home}/.m2/repositoryYou change that 通过将系统变量 maven.repo.local 设置为另一个位置(或通过告诉 Maven 使用特定的 settins.xml)。但是,目前,无法将 Maven 配置为将特定工件安装到与获取下载工件不同的本地存储库中。

    一种可能的解决方法是声明install-file 目标的执行,绑定到install 阶段,并声明它以将您想要的所有工件安装到指定的本地存储库。

    <plugin>
        <artifactId>maven-install-plugin</artifactId>
        <version>2.5.2</version>
        <executions>
            <execution>
                <phase>install</phase>
                <goals>
                    <goal>install-file</goal>
                </goals>
                <configuration>
                    <file><!-- path to artifact to install --></file>
                    <pomFile><!-- path to POM of artifact --></pomFile>
                    <localRepositoryPath><!-- path to repository you want to install to --></localRepositoryPath>
                </configuration>
            </execution>
        </executions>
    </plugin>
    

    【讨论】:

    • 有趣但不明显如何将其通用化为任何工件。
    • @JesseGlick 是的,您需要将需要安装的每个工件的配置复制到另一个非通用的本地存储库...我不认为 install 目标是有意的使用另一个本地存储库:这意味着 Maven 然后需要查看 2 个不同的本地存储库来解决依赖关系。也许你可以在用户邮件列表中问这个?我还对 JIRA 问题发表了评论issues.apache.org/jira/browse/…
    【解决方案2】:

    MINSTALL-126 关于是否可以将其添加到 maven-install-plugin 的增强。同时,请参阅我在http://blog2.vorburger.ch/2016/06/maven-install-into-additional.html 上写的博客文章中的以下解决方法,稍微扩展了上面的建议,并提供了一些关于为什么这会有用的背景:

      <profiles>
        <profile>
          <activation>
            <property>
              <name>addInstallRepositoryPath</name>
            </property>
          </activation>
          <build>
            <plugins>
              <plugin>
                <artifactId>maven-install-plugin</artifactId>
                <executions>
                  <execution>
                    <id>additional-install</id>
                    <phase>install</phase>
                    <goals>
                      <goal>install-file</goal>
                    </goals>
                    <configuration>
                      <file>${project.build.directory}/${project.build.finalName}.jar</file>
                      <localRepositoryPath>${addInstallRepositoryPath}</localRepositoryPath>
                    </configuration>
                  </execution>
                </executions>
              </plugin>
            </plugins>
          </build>
        </profile>
      </profiles>
    

    【讨论】:

    • 也很有趣,但不清楚如何修改它以安装到单独的 repository 中,包括 ${project.groupId.butWithSlashes}/${project.artifactId}/ 目录前缀。
    • Jesse,这正是这样做的 - 它将当前工件安装到单独的存储库中,而不是根目录,而是安装到正确的目录(groupId.butWithSlashes 等)。它不适用于附加的工件和 pom 不过,只是简单的 JAR。 MINSTALL-126 增强将是干净的解决方案。
    【解决方案3】:

    正式化和扩展问题中的“更新”(顺便说一句,您应该毫不犹豫地回答自己的问题):

    我独立得出了类似的结论并包括

    find -L ~/.m2/repository \( -type d -name '*-SNAPSHOT' -prune -o -type f -name maven-metadata-local.xml \) -exec rm -rfv {} \;
    

    在我不时运行的一般“清理”脚本中。请注意,这与 install:install 总是以(至少)三种方式去一个单独的位置的理想不同:

    • 您必须记住运行此脚本,因此在此期间,您可能会使本地存储库被您构建的东西“污染”。有时这意味着构建将在本地为您工作,但对其他人不起作用。 (或者甚至只失败或者你失败,或者对每个人都成功但行为略有不同。)这违背了可重复构建的目标,除非你有足够的互联网带宽并且愿意运行docker run --rm -v "$PWD":/usr/src/mymaven -w /usr/src/mymaven maven mvn clean install
    • 如果有人故意将deployed SNAPSHOTs 写入共享存储库,此脚本将删除它们,因此您的下一个构建将不得不重复下载。
    • 本地installs 的发布版本没有被删除。现在,如果这些来自release:perform,因为你是删减版本的人,那还不错——大概远程工件与你的本地副本相同。真正邪恶的地方是,如果在尝试通过使用一些诊断补丁(例如)从源重建来调试其他人发布的工件中的某些问题的过程中,您忘记编辑 pom.xml 以使用 SNAPSHOT 或其他区别版本和install 结果。 Maven 永远不会注意到您的本地副本与官方版本不同,并且您可能会在几个月后遇到奇怪的情况。当然,这从未发生在我身上。

    后两个问题也许可以通过解析maven-metadata-*.xml 文件的更复杂的脚本来解决,而不是假设所有且只有SNAPSHOTs 是本地构建。或者正如提交者所暗示的那样,如果存在maven-metadata-local.xml,只需删除整个版本目录(以某种方式将其与父工件目录区分开来,该目录也将具有这样的文件,resolver-status.properties 也有)。

    虽然 Maven 3 记录了一些关于本地存储库中工件的来源的信息,但这还不够好。我真正欣赏的是如果install:install 总是保存到一个不同的位置,这样主本地存储库就可以被认为是纯粹的下载缓存。如果基于命令行开关(发出警告后)发生冲突,本地工件解析将优先选择一个或另一个存储库。

    【讨论】:

      猜你喜欢
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多