我有一个项目需要提供一个jar文件:
<packaging>jar</packaging>
但jar是以自定义方式构建的,因此使用jar:jar完成的默认包装已被禁用
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<executions>
<execution>
<id>default-jar</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
但是当我想要应用阴影时:现有jar上的阴影我得到一个错误
项目主要工件不存在。
我认为maven不知道我的自定义工具创建的.jar文件。如何让它知道,因为antrun attachArtifact不起作用
<attachartifact file="./bin/classes.jar" classifier="" type="jar"/>
我得到的错误是
发生了Ant BuildException:org.apache.maven.artifact.InvalidArtifactRTException:对于工件{:jar}:附加的工件必须具有与其对应的主工件不同的ID。
所以这不是注册主工件的方法......有没有(没有编写自定义java插件)?
谢谢, 卢卡斯
答案 0 :(得分:2)
我检查了JarMojo的来源,它让我知道如何用Groovy解决它(通过gmaven)
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>set-main-artifact</id>
<phase>package</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
project.artifact.setFile(new File("./bin/classes.jar"))
</source>
</configuration>
</execution>
</executions>
</plugin>
它有效!:)
答案 1 :(得分:1)
像这样的东西
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>attach-artifacts</id>
<phase>package</phase>
<goals>
<goal>attach-artifact</goal>
</goals>
<configuration>
<artifacts>
<artifact>
<file>${basedir}/bin/classes.jar</file>
<type>jar</type>
</artifact>
</artifacts>
</configuration>
</execution>
</executions>
</plugin>
答案 2 :(得分:1)
虽然您的解决方案可能适用于安装+阶段的构建或反应堆中没有依赖项,但在仅构建到编译或测试阶段的情况下,依赖项不会找到未打包的类。 使用像maven-release-plugin这样的插件时会发生编译。
扩展您选择的解决方案,以包括在编译期间识别解压缩的类
<plugin>
<groupId>org.codehaus.gmaven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>set-main-artifact-compile</id>
<phase>compile</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
project.artifact.setFile(new File("./bin/classes"))
</source>
</configuration>
</execution>
<execution>
<id>set-main-artifact</id>
<phase>package</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
project.artifact.setFile(new File("./bin/classes.jar"))
</source>
</configuration>
</execution>
</executions>
</plugin>
默认情况下,maven-install-plugin将使用沿着行的已识别工件
${project.build.directory}/${project.finalname}.jar
所以另一种选择可能会像这样
<build>
<directory>bin</directory>
<outputDirectory>bin/classes</outputDirectory>
<finalName>classes</finalName>
</build>
答案 3 :(得分:0)
我们遇到了同样的问题,因为“附加的工件必须具有与其相应的主工件不同的ID”错误。我们在以下优秀博文中找到了解决方案:
http://devblog.virtage.com/2013/04/embed-and-run-ant-tasks-and-scripts-from-maven/
如详细in this section,您可以通过添加分类器来解决问题,以便Maven可以区分ant-built jar和maven-built jar。因为你正在使用antrun attachartifact,你需要这个:
<attachartifact file="./bin/classes.jar" classifier="foo" type="jar"/>
请注意,每当您想要将此jar作为其他项目中的依赖项时,您还需要包含该分类器(以及groupId,artifactId和version)。