如何将自定义构建的jar文件注册为maven主要工件?

时间:2012-05-04 12:54:52

标签: maven jar maven-antrun-plugin gmaven-plugin

我有一个项目需要提供一个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插件)?

谢谢, 卢卡斯

4 个答案:

答案 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)。