使用 Maven 分隔本地下载和安装存储库



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

我不是在谈论deploy,只是mvn install.

更新

我找到了另一种解决方案,仅使用一个本地存储库来存储下载和自建工件:自建的带有名为"maven-metadata-local.xml"的文件,所以我现在根据该文件的存在选择要清除的存储库目录......

你不能

install目标做到这一点。 maven-install-plugin会将项目安装到用于从中获取下载的项目的同一本地存储库。默认情况下,这是 ${user.home}/.m2/repository .您可以通过将系统变量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>

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>

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

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

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
  • 如果有人有意将SNAPSHOT deploy到共享存储库,则此脚本将删除他们,因此您的下一个构建将不得不重复下载。
  • 不会删除发布版本的本地install。现在,如果这些来自release:perform,因为您是剪辑发布的人,那还不错 - 无论如何,远程工件可能与您的本地副本相同。真正邪恶的地方是,在尝试通过从具有一些诊断补丁的源代码(例如)重建来调试其他人发布的工件中的某些问题的过程中,您忘记编辑pom.xml以使用SNAPSHOT或其他区分版本,并install结果。Maven永远不会注意到您的本地副本与正式版本不同,几个月后您可能会陷入奇怪的情况。当然,这从未发生在我身上。

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

虽然Maven 3记录了一些关于本地存储库中工件来源的信息很好,但这还不够好。我真正希望的是,如果install:install始终保存到一个不同的位置,以便可以信任主要的本地存储库纯粹是下载缓存。然后,本地项目解析将首选一个或另一个存储库,以防基于命令行开关(发出警告后)发生冲突。

相关内容

  • 没有找到相关文章

最新更新