我有一个包含 3 个不同库的项目。当我运行安装脚本时,它会从 repo 中获取所有库并在它们上运行 mvn clean install。但是这个版本的库已经安装在 repo 中。如果 pom.xml 中的版本与我的本地存储库中的版本相同,有没有办法跳过安装阶段。
我知道我可以使用本地仓库并设置依赖项。但是我的老板希望我们的项目只能使用公共回购而不是我们的任何回购来构建。
我有一个包含 3 个不同库的项目。当我运行安装脚本时,它会从 repo 中获取所有库并在它们上运行 mvn clean install。但是这个版本的库已经安装在 repo 中。如果 pom.xml 中的版本与我的本地存储库中的版本相同,有没有办法跳过安装阶段。
我知道我可以使用本地仓库并设置依赖项。但是我的老板希望我们的项目只能使用公共回购而不是我们的任何回购来构建。
你可以这样绕过
-Dmaven.install.skip=true
<profiles>
<profile>
<id>skipInstall</id>
<activation>
<property>
<name>maven.install.skip</name>
<value>true</value>
</property>
</activation>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<executions>
<execution>
<id>default-install</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
上周 Olivier Lamy 修补了这个 jira。
大多数 maven 插件可以通过指定如下内容来跳过:
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>X.Y</version>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
您还可以设置构建配置文件来设置属性并使用它来确定值。例如,运行命令: mvn -Pexample 将选择“示例”配置文件。然后,POM 将包含:
...
<properties>
<skip.install>false</skip.install>
...
</properties>
...
<profile>
<id>example</id>
<properties>
<skip.install>false</skip.install>
</properties>
</profile>
...
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>X.Y</version>
<configuration>
<skip>${skip.install}</skip>
</configuration>
</plugin>
...
使用这些 POM 添加,安装插件的默认行为将执行其默认目标,但如果选择示例配置文件,则安装插件将跳过其目标。
使用我从其他答案中学到的知识,这对我来说是最干净的结果。
在我的超级 pom 中,我添加了一个 pluginManagement/plugin 以在设置属性时禁用默认安装和默认测试阶段deployOnly
。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>default-install</id>
<configuration>
<skip>${deployOnly}</skip>
</configuration>
</execution>
<execution>
<id>default-test</id>
<configuration>
<skip>${deployOnly}</skip>
</configuration>
</execution>
</executions>
</plugin>
所以在命令行上,我可以通过添加来禁用安装和测试阶段-DdeployOnly
。
mvn clean install #build and test everything
mvn deploy -DdeployOnly #just deploy it
我知道我可以使用本地仓库并设置依赖项。但是我的老板希望我们的项目只能使用公共回购而不是我们的任何回购来构建。
你确定你理解正确你老板的意思吗?我将上述解释为“不要在本地存储库中安装第三方库,仅使用公共存储库中可用的库”。这与基本上不可能的“不要使用本地存储库”不同,这不是 maven 的工作方式。我会尝试澄清这一点。
除此之外,我没有得到非常令人困惑的问题(你在说什么回购?安装脚本在做什么?为什么你在库上调用全新安装?等等)。
从未来扩展其他答案。
Maven插件的自由度高得惊人,它们是如何运行的。如果他们愿意,他们可以忽略/覆盖典型的 pom.xml 设置。此外,这也<configuration><skip>true</skip></configuration>
只是一个约定,没有任何插件必须遵循它,除非它们中的大多数都是这样开发的。
我对最近问题的实验表明,@Cemo 和 @MiloshBoroyevich 的解决方案都应该被利用,而且插件需要两者才能真正让我们安心。更具体地说,我唯一的工作配置是:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
<executions>
<execution>
<id>default-install</id>
<phase>none</phase>
</execution>
</executions>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
mvn deploy
将调用将触发附加到它及其前身的所有目标的阶段。 deploy
相反,您想要的是仅调用目标 deploy
。
因此,您可以使用mvn jar:jar deploy:deploy
.