我想不时从头开始重建我的项目结构,并希望清除构建的存储库以做到这一点。但是,我不想从 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
始终保存到一个不同的位置,以便可以信任主要的本地存储库纯粹是下载缓存。然后,本地项目解析将首选一个或另一个存储库,以防基于命令行开关(发出警告后)发生冲突。