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:deploy
或deploy:deploy
目标(即从maven-deploy-plugin
, deploy
目标,而不是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-plugin
和maven-deploy-plugin
正在复制/上传相同的一组文件。 所以当你只执行deploy:deploy
,那么上下文中就没有文件了,没有什么可以部署的。
事实上, deploy:deploy
需要一些运行时信息放在构build上下文(或之前的插件/目标执行)中。
它也报告为一个潜在的错误: MDEPLOY-158
:部署:部署不工作仅部署工件到Maven远程回购
但后来被拒绝不是问题。
maven-deploy-plugin
的deployAtEnd
configuration选项在某些情况下不会有帮助,因为我们有中间的工作步骤来执行:
是否每个项目都应该在自己的部署阶段或多模块构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-plugin
, buildnumber-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文件和删除目标文件,然后清理应用程序,你发现它将运行