使用maven分离本地下载和安装存储库?

时间:2016-02-17 08:58:54

标签: maven repository

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

NOT 正在谈论deploy,只是mvn install

更新

我找到了一个替代解决方案,只使用一个本地存储库来下载和自建工件:自建的工件包含名为“maven-metadata-local.xml”的文件,因此我选择要清除的存储库目录现在根据该文件的存在...

3 个答案:

答案 0 :(得分:2)

您无法通过install目标实现这一目标。 maven-install-plugin会将工件安装到用于从中获取下载工件的同一本地存储库。默认情况下,这是${user.home}/.m2/repository。通过将系统变量maven.repo.local设置为其他位置(或通过告诉Maven使用特定的settins.xml)来You change that。但是,目前,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>

答案 1 :(得分:1)

关于是否可以将其添加到maven-install-plugin的

MINSTALL-126增强功能。与此同时,请参阅以下解决方法,稍微扩展上面提到的内容,我在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>

答案 2 :(得分:0)

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

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

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
  • 如果有人故意deploy编辑SNAPSHOT到共享存储库,此脚本将删除它们,因此您的下一个版本将不得不重复下载。
  • 发布版本的本地install 已删除。现在,如果这些来自release:perform,因为你是那个削减版本的人,那就不是那么糟糕了 - 大概是远程工件与你的本地副本相同。如果在尝试通过从具有某些诊断补丁(例如)的源重建来调试其他人发布的工件中的某些问题的过程中,这会变得非常邪恶,您忘记编辑pom.xml以使用{{1} }或其他区别版本,SNAPSHOT结果。 Maven永远不会注意到您的本地副本与官方版本不同,并且几个月后您可能会遇到奇怪的情况。当然,这从未发生在我身上。

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

尽管Maven 3记录了一些关于本地存储库中的工件来自何处的信息,但这还不够好。我真正感谢的是,如果resolver-status.properties始终保存到不同的位置,那么可以信任主本地存储库纯粹是下载缓存。如果基于命令行开关发生冲突(在发出警告之后),本地工件解析将更喜欢一个或另一个存储库。