11

我有一个项目预计会提供一个 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 上应用 shade:shade 时出现错误

项目主工件不存在。

我假设 maven 不知道我的自定义工具创建的 .jar 文件。如何让它知道,因为antrun attachArtifact不起作用

<attachartifact file="./bin/classes.jar" classifier="" type="jar"/>

我得到的错误是

发生 Ant BuildException:org.apache.maven.artifact.InvalidArtifactRTException:对于工件 {:jar}:附加工件的 ID 必须与其对应的主工件不同。

所以这不是注册主要工件的方法......有没有(不编写自定义java插件)?

谢谢,卢卡斯

4

4 回答 4

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>

它有效!:)

于 2015-07-20T10:04:17.740 回答
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>
于 2013-04-24T19:40:48.417 回答
1

虽然您的解决方案可能适用于构建到 install+ 阶段或反应堆中没有依赖项的情况,但在仅构建到编译或测试阶段的情况下,依赖项不会找到未打包的类。使用 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>
于 2014-08-19T21:55:56.930 回答
0

我们遇到了同样的问题,出现“附加的工件必须具有与其相应的主工件不同的 ID”错误。我们在以下优秀的博客文章中找到了解决方案:

http://devblog.virtage.com/2013/04/embed-and-run-ant-tasks-and-scripts-from-maven/

本节所述,您可以通过添加分类器来解决此问题,以便 Maven 可以区分 ant-built jar 和 maven-built jar。由于您使用的是 antrun attachartifact,因此您需要:

<attachartifact file="./bin/classes.jar" classifier="foo" type="jar"/>

请注意,当您想要将此 jar 作为其他项目的依赖项时,您还需要包含该分类器(以及 groupId、artifactId 和 version)。

于 2013-04-24T17:59:25.143 回答