我想不时地从头开始重建我的项目结构,并且想要清除构建的存储库以便这样做。但是,我不想从maven中心和其他存储库中删除下载的文件。有没有一种简单的方法可以告诉maven将我构建的工件安装到一个单独的存储库中,即。除了用于存储下载的外部文件的那个?
我 NOT 正在谈论deploy
,只是mvn install
。
更新
我找到了一个替代解决方案,只使用一个本地存储库来下载和自建工件:自建的工件包含名为“maven-metadata-local.xml”的文件,因此我选择要清除的存储库目录现在根据该文件的存在...
答案 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)
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
始终保存到不同的位置,那么可以信任主本地存储库纯粹是下载缓存。如果基于命令行开关发生冲突(在发出警告之后),本地工件解析将更喜欢一个或另一个存储库。