Maven:这个项目的包装没有给构build工件分配一个文件

我在Mac 10.6.6上使用Maven 3.0.3。 我有一个JAR项目,当我运行命令“mvn clean install:install”时,我得到错误,

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.3.1:install (default-cli) on project StarTeamCollisionUtil: The packaging for this project did not assign a file to the build artifact -> [Help 1] 

这是什么意思,我该如何解决? 以下是我的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/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.myco.starteam.util</groupId> <artifactId>StarTeamCollisionUtil</artifactId> <packaging>jar</packaging> <name>StarTeam Collision Util</name> <description> The StarTeam Collision Utility provides developers and release engineers alike the ability to compare files attached to a set of CRs to see if conflicts exist in the change set. </description> <version>1.0-SNAPSHOT</version> <url>http://cm-build.myco.com:8080/hudson/view/Tools/job/StarTeamCollisionUtil - TRUNK/</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <repositories> <repository> <id>myco-sonatype-nexus-snapshots</id> <name>MyCo Sonatype-Nexus Snapshots</name> <url>http://sonatype.myco.com/nexus/content/repositories/snapshots/</url> </repository> </repositories> <dependencies> <dependency> <groupId>starteam</groupId> <artifactId>starteam</artifactId> <version>1.1.0</version> <type>jar</type> <scope>system</scope> <systemPath>${basedir}/lib/starteam110.jar</systemPath> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.2</version> </dependency> <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactId> <version>1.8.1</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.1</version> <type>jar</type> <scope>compile</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.8.1</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <version>3.0-beta-3</version> <configuration> <reportPlugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-report-plugin</artifactId> <version>2.5</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>2.7</version> <configuration> <linksource>true</linksource> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jxr-plugin</artifactId> <version>2.2</version> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>1.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> <version>2.3.1</version> <reportSets> <reportSet> <reports> <report>index</report> <report>dependencies</report> <report>dependency-management</report> <report>cim</report> <report>issue-tracking</report> <report>license</report> <report>scm</report> </reports> </reportSet> </reportSets> </plugin> </reportPlugins> </configuration> </plugin> </plugins> </build> <distributionManagement> <repository> <id>sonatype-nexus</id> <url>http://sonatype.myco.com/nexus/content/repositories/snapshots/</url> </repository> </distributionManagement> <scm> <url>https://starteam.cmass.myco.com/BorlandStarTeam/BorlandStarTeam.jsp</url> </scm> <issueManagement> <system>StarTeam</system> <url>https://starteam.cmass.myco.com/BorlandStarTeam/BorlandStarTeam.jsp</url> </issueManagement> <ciManagement> <system>Hudson</system> <url>http://cm-build.myco.com:8080/hudson/</url> </ciManagement> </project> 

我不知道这是否是答案,但可能导致你朝着正确的方向前进。

命令install:install实际上是maven-install-plugin中的一个目标。 这与install maven生命周期阶段不同。

Maven生命周期阶段是构build过程中的某些插件可以绑定到的步骤。 当您调用单个生命周期阶段时,可能会执行来自不同插件的许多不同目标。

这可以归结为命令…

 mvn clean install 

不同于…

 mvn clean install:install 

前者将在每个循环中执行所有目标,包括安装(如编译,打包,testing等)。 后者甚至不会编译或打包你的代码,它只会运行这一个目标。 这是有道理的,看看例外; 它谈到:

StarTeamCollisionUtil:此项目的包装未将文件分配给构build工件

试试前者,你的错误可能会消失!

TL; DR要解决这个问题,请先调用打包插件,例如,对于jar打包使用maven-jar-plugin ,如下所示:

 mvn jar:jar install:install 

要么

 mvn jar:jar deploy:deploy 

如果你真的需要部署。

陷阱如果你有不同的包装(ear / war / jar / zip)的多模块项目,这种方法将无法工作 – 更糟的是,错误的工件将被安装/部署! 在这种情况下,使用反应堆选项来构build可部署模块(例如war )。


说明

在某些情况下,您实际上想要直接运行install:install deploy:deploydeploy:deploy目标(即从maven-deploy-plugindeploy目标,而不是Maven deploy 阶段 ),最终会导致恼人The packaging for this project did not assign a file to the build artifact

一个典型的例子是CI工作(例如Jenkins或Bamboo工作),在不同的步骤中你想要执行/关心不同的方面:

  • 第一步是mvn clean install ,执行testing和testing覆盖
  • 第二个步骤是基于质量概况的Sonarqube分析,例如mvn sonar:sonar和其他选项
  • 然后,只有当成功的testing执行和质量门通过之后,你才想在你的Maven企业仓库中部署最终的项目工件,但是你不想重新运行mvn deploy ,因为它会再次执行以前的阶段(并编译,testing等),你希望你的构build是有效的,但仍然很快

是的,您可以通过至less跳过testing(编译和执行,通过-Dmaven.test.skip=true )或者使用特定configuration文件(尽可能多地跳过尽可能多的插件)来加速最后一步,但这样做更容易,清除以简单地运行mvn deploy:deploy然后mvn deploy:deploy

但是,上面的错误会失败,因为插件常见问题解答中也指定了这个错误:

在包装阶段,所有的事情都被收集起来, 有了这个机制,Maven可以确保maven-install-pluginmaven-deploy-plugin正在复制/上传相同的一组文件。 所以当你只执行deploy:deploy ,那么上下文中就没有文件了,没有什么可以部署的。

事实上, deploy:deploy需要一些运行时信息放在构build上下文(或之前的插件/目标执行)中。

它也报告为一个潜在的错误: MDEPLOY-158 :部署:部署不工作仅部署工件到Maven远程回购

但后来被拒绝不是问题。

maven-deploy-plugindeployAtEndconfiguration选项在某些情况下不会有帮助,因为我们有中间的工作步骤来执行:

是否每个项目都应该在自己的部署阶段或多模块构build结束时进行部署。 如果设置为true并且构build失败,则不会部署任何反应器项目。 (实验)

那么,如何解决呢?
只需在类似的第三步/最后一步中运行以下步骤:

 mvn jar:jar deploy:deploy 

maven-jar-plugin不会重新创build任何jar作为你的构build的一部分,这要归功于它的forceCreation选项默认设置为false

即使没有任何内容出现变化,也需要jar插件来构build新的JAR。 默认情况下,这个插件会查看输出jar是否存在,input没有改变。 如果这些条件成立,插件会跳过创buildjar。

但它会很好地填充我们的构build上下文,并进行deploy:deploy快乐。 没有testing跳过,没有configuration文件添加。 正是你所需要的:速度。


附加说明:如果您使用build-helper-maven-pluginbuildnumber-maven-plugin或其他类似的插件来生成maven-jar-plugin使用的元数据(例如Manifest文件的条目),你最有可能有执行链接到validate阶段,你仍然希望在jar:jar构build步骤(并保持快速执行)。 在这种情况下,几乎无害的开销是调用validate 阶段如下:

 mvn validate jar:jar deploy:deploy 

还有一点需要注意的是:如果你不是jar而是war包装,那么在安装/ deploy之前使用war:war来代替。

如上所述,检查多模块项目中的行为。

我有同样的问题。 我的错误信息不完整。 但在我的情况下,我已经添加了代码与源代码。 通过将这个代码放在pom.xml中:

 <build> <pluginManagement> <plugins> <plugin> <artifactId>maven-source-plugin</artifactId> <version>2.1.2</version> <executions> <execution> <phase>deploy</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> </plugins> </pluginManagement> </build> 

所以在部署阶段,我执行源代码:jar目标,它会产生jar源代码。 部署以BUILD SUCCESS结束

你必须清除目标文件,如在jar和其他人在C:驱动器的文件夹在.m2看到它安装的位置和删除.jar文件,Snaphot文件和删除目标文件,然后清理应用程序,你发现它将运行