首页 > 解决方案 > 'mvn clean' vs.'mvn clean install'(当插件执行附加到'clean'时)

问题描述

假设我想在编译项目之前将项目本地依赖项(jar 文件)安装到我的本地 maven 存储库(~/.m2),这样我就可以在我的 POM 中引用它们,就像我引用来自 Maven Central 的任何依赖项一样。目前,我正在使用附加到“干净”阶段的 Maven 安装插件的安装文件目标(因为我的 IDE 使用它),如下所示:

<dependencies>
   <dependency>
      <groupId>group.id</groupId>
      <artifactId>artifact.id</artifactId>
      <version>artifact.version</version>
   </dependency>
</dependencies>

<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-install-plugin</artifactId>
         <version>2.5.2</version>
         <executions>
            <execution>
               <id>install-my-local-dependency</id>
               <phase>clean</phase>
               <goals>
                  <goal>install-file</goal>
               </goals>
               <configuration>
                  <groupId>group.id</groupId>
                  <artifactId>artifact.id</artifactId>
                  <version>artifact.version</version>
                  <file>${project.basedir}/lib/local-dep.jar</file>
                  <packaging>jar</packaging>
                  <generatePom>true</generatePom>
               </configuration>
            </execution>
         </executions>
      </plugin>
   </plugins>
</build>

当我执行mvn clean(或其在 IDE 中的等价物)时,一切都按我的预期运行:

--- maven-clean-plugin:2.5:clean (default-clean) @MyProject ---

--- maven-install-plugin:2.5.2:install-file (install-...) @ MyProject --- 安装 ${project.basedir}/lib/local-dep.jar 到 ~/.m2/repository /group.id/artifact.id/local-dep.jar

但是,当我mvn clean install改为执行(或其在 IDE 中的等效项)时,出现以下错误:

无法在项目 MyProject 上执行目标:无法解析项目 com.example.MyProject:jar:1.0 的依赖项:在中央(https://repo. maven.apache.org/maven2 ) -> [帮助 1]

出于某种原因,Maven 安装插件的 install-file 目标在这种情况下要么不运行,要么运行得不够快。为什么?我发现的其他 StackOverflow 答案解释了两个命令之间的差异,但在我看来,它们并没有解释这种特殊差异,因为我的项目没有模块。

有没有更好的方法跨平台做同样的事情,即使在构建服务器(例如 Jenkins)和至少一个其他依赖项目上?

如果有任何帮助,我有以下 Maven 版本:

标签: javamaven

解决方案


Maven首先分析pom.xml然后调用目标/阶段。分析本身很复杂,深度不同,所以我猜clean单独调用不会让Maven分析依赖关系,但是调用clean install会这样做。请注意,POM 分析只发生一次,而不是针对每个目标/阶段再次进行。

通常,不推荐您的方法。通常,您将项目依赖项放入远程 Maven 存储库中,以便可以通过它们解决它们。如果您在公司内部工作,您应该设置一个 Nexus/Artifactory 服务器来处理您的工件。

如果您希望公司以外的人构建工件,您需要找到 Maven 存储库的提供者。我想 github/gitlab 可以在这里为您提供帮助。然后您需要将这些存储库添加到 POM。


推荐阅读