mvn clean没有依赖

时间:2011-06-09 15:09:02

标签: maven-2 maven

我有一个第三方jar,这是我们项目所必需的。它在中央maven存储库中不可用,因此我使用maven-install-plugin在构建期间在本地安装jar。我将“安装文件”目标绑定到“验证”阶段,这主要起作用。 pom.xml文件摘录如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <version>2.3</version>
            <executions>
                <execution>
                    <id>install-myartifact</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>${basedir}/lib/myartifact-1.2.3.jar</file>
                        <groupId>com.example</groupId>
                        <artifactId>myartifact</artifactId>
                        <version>1.2.3</version>
                        <packaging>jar</packaging>
                        <generatePom>true</generatePom>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<dependencies>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>myartifact</artifactId>
        <version>1.2.3</version>
    </dependency>
</dependencies>

然而,有一个问题。我们的大多数开发人员和我们的Jenkins安装都运行“mvn clean install”。 “验证”阶段不是“干净”生命周期的一部分,清理莫名其妙地要求运行所有依赖关系。因此,有人第一次运行此构建时,它不起作用。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building MyModule
[INFO]    task-segment: [clean, install]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean]
[INFO] Deleting directory C:\svn\trunk\mymodule\target
Downloading: http://nexusserver.local:8080/nexus/content/groups/public/com/example/myartifact-1.2.3.pom
[INFO] Unable to find resource 'com.example:myartifact:pom:1.2.3' in repository central (http://central)
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD ERROR
[INFO] ------------------------------------------------------------------------
[INFO] Failed to resolve artifact.

Missing:
----------
1) com.example:myartifact:jar:1.2.3

  Try downloading the file manually from the project website.

  Then, install it using the command: 
      mvn install:install-file -DgroupId=com.example -DartifactId=myartifact -Dversion=1.2.3 -Dpackaging=jar -Dfile=/path/to/file

  Alternatively, if you host your own repository you can deploy the file there: 
      mvn deploy:deploy-file -DgroupId=com.example -DartifactId=myartifact -Dversion=1.2.3 -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

  Path to dependency: 
    1) com.example:mymodule:war:0.0.1-SNAPSHOT
    2) com.example:myartifact:jar:1.2.3

----------
1 required artifact is missing.

for artifact: 
  com.example:mymodule:war:0.0.1-SNAPSHOT

from the specified remote repositories:
  nexus (http://nexusserver.local:8080/nexus/content/groups/public)



[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1 second
[INFO] Finished at: Thu Jun 09 11:01:24 EDT 2011
[INFO] Final Memory: 17M/247M
[INFO] ------------------------------------------------------------------------

如果我只是简单地运行“mvn install”,那么在“验证”期间安装jar,我可以在后续版本中运行“mvn clean install”。但是,我们的构建服务器没有这种灵活性。我考虑过以下几点:

  1. 将阶段移至“预清洁”,但这假设每个人都是第一次使用清洁。如果有人只是简单地“mvn install。”就行不通。
  2. 复制执行,其中一个在“预清理”期间发生,一个在“验证”期间发生。这涵盖了所有基础,但复制的代码留下了不好的味道。
  3. 理想情况下,我会喜欢其他选择。是否可以在没有依赖性的情况下运行干净?或者运行一个插件两次而不必完全复制执行?谢谢!

4 个答案:

答案 0 :(得分:5)

看起来你正在使用nexus。将工件部署到nexus repo可能更容易,而不必使用此项目进行维护。

答案 1 :(得分:5)

我遇到了一个相关的问题,我在搜索解决方案时发现了这个问题,所以我会在这里注意到:

如果在同一个项目中缺少依赖项,如果在清理期间调用了插件,则

mvn clean在多模块项目中失败。

我们在一些模块的清理阶段调用antrun-plugin,因此需要在maven资源库中存在所有依赖项,包括同一个反应堆中的其他模块,在某些情况下还没有构建(比如你刚刚碰到了项目版本,或者你正在开始一个新项目)。

这是http://jira.codehaus.org/browse/MANTRUN-78中报告的maven-antrun错误 - 这又导致了maven核心中的错误:http://jira.codehaus.org/browse/MNG-3283

我的解决方法是为开发人员(和Jenkins)提供另一种干净的方法(shell / bat脚本,ant脚本或一些git / hg clean操作),并让他们调用它。

我建议为您的团队提供类似的解决方法(或者只是在团队内部设置共享maven存储库,必要时使用其中一个开发人员计算机。)

答案 2 :(得分:0)

这是未经测试的,但您是否可以忽略clean插件配置中的错误?如:

<plugin>
  <artifactId>maven-clean-plugin</artifactId>
  <version>2.4.1</version>
  <configuration>
    <failOnError>false</failOnError>
  </configuration>
</plugin>

(这是来自Maven Clean Plugin : Ignoring Clean Errors

答案 3 :(得分:0)

这是另一种可能性。

将maven配置为跳过清洁阶段并在初始化期间运行清理。虽然没试过。

这样做的缺点是maven会一直清理输出文件夹。