当前位置: 首页 > 知识库问答 >
问题:

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

鞠自明
2023-03-14

我有一个项目希望交付一个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 attach工件不起作用

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

我得到的错误是

发生Ant BuildException:org。阿帕奇。专家人工制品InvalidArtifactrException:对于工件{:jar}:附加的工件必须具有与其对应的主工件不同的ID。

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

谢了卢卡斯

共有3个答案

韦思淼
2023-03-14

虽然您的解决方案可能适用于构建到安装阶段或反应器中没有依赖项的情况,但在仅构建到编译或测试阶段的情况下,依赖项将找不到未打包的类。当使用像maven release插件这样的插件时,就会生成编译。

扩展您选择的解决方案,以包括在编译期间识别未打包的类

<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>
马华茂
2023-03-14

像这样的东西

<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>
江德海
2023-03-14

我检查了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>

它是有效的!:)

 类似资料:
  • 最近我一直在写插件,然后使用ServiceLoader加载。为了让ServiceLoader找到我的插件,必须在META-INF/services/下的jar中包含一个文本文件。文本文件必须以ServiceLoader正在“寻找”的接口命名,并且必须包含实现类的规范名称。所有这些都工作得非常好,但是这种方法有一个非常烦人的问题:每次构建项目时,我都必须手动将 /services/文件夹以及文本文件

  • Jenkins存档工件插件将文件压缩到“archive.zip”文件中。它始终具有相同的文件名。更重要的是,Jenkins实际上并不存档(“builds”目录中没有任何“archive.zip”文件)。Jenkins just映射url 问题是,该作业本身生成ZIP归档,所以我需要以原始名称发布这个归档。这很重要,因为归档的名称明确了作业的所有者、内部的数据以及用于运行作业的参数。假设用户使用不同

  • 注意:我的jar是一个用Warbler编译成jar的jruby文件。

  • 我想从maven转到gradle。 在pom中。xml文件我有一个自定义存储库: 它是一个简单的超文本传输协议Web服务器,带有. jar文件。 如何将此自定义回购添加到生成中。格拉德尔? 我尝试了此代码,但不起作用: 我的定制repo不是maven repo,但我在Gradle文档中没有找到可以指定URL的其他示例。

  • 我想注册一个Avro模式,它在模式注册表上引用另一个Avro模式。 首先,我注册了以下基本Avro模式: 如果我尝试注册以下Avro架构,该架构引用“客户端”属性中的基本架构,则操作失败并出现错误422 这个问题似乎与指定自定义类型字段有关。 任何想法如何添加自定义类型,同时注册相关的模式在模式注册表?

  • 问题内容: 我想在定义类时注册一个类的实例。理想情况下,以下代码可以解决问题。 不幸的是,此代码生成错误。 发生的事情是在我尝试实例化a的行上,但装饰器尚未返回,因此它不存在。 是否使用元类解决了这个问题? 问题答案: 是的,元类可以做到这一点。元类的方法返回该类,因此只需在返回之前注册该类。 前面的示例在Python 2.x中有效。在Python 3.x中,的定义略有不同(虽然未更改,但未显示-