【问题标题】:How do I set the pom as the default artifact in a maven plugin?如何将 pom 设置为 maven 插件中的默认工件?
【发布时间】:2019-04-03 15:52:05
【问题描述】:

我正在编写一个 Maven 插件,我不需要将任何真正的工件附加到项目中(它是一个产品,无意让任何东西依赖它)。最终的工件(一个 tgz 包,用于固件安装)非常大,因此我不希望它在本地或我们的 nexus 存储库中无缘无故地占用空间——我们将它推送到其他检索它的服务来自运营中。

因此,我想告诉 Maven 没有默认工件,或者只需要部署 pom 本身。在插件中,我尝试将默认工件 (MavenProject.setArtifact) 设置为 pom 本身,但这会导致发布问题,因为 Maven 尝试部署 pom 两次,我们将 Nexus 设置为不允许非快照版本。

如果我根本不setArtifact,我会得到:

The packaging for this project did not assign a file to the build artifact

我的项目正在使用具有自定义生命周期的插件,在 components.xml 中定义。我尝试将扩展名和打包设置为pom,但这没有帮助。

<component> ... <configuration> <extension>pom</extension> <packaging>pom</packaging> <addedToClasspath>false</addedToClasspath> <lifecycles> ... </configuration> </component>

有没有办法告诉 Maven pom 是唯一要部署的工件?

【问题讨论】:

    标签: maven maven-plugin


    【解决方案1】:

    深入研究maven的源代码,特别是maven-install-plugin使用的DefaultProjectInstaller,目前看来这是不可能的。

    Maven 允许 pom 文件本身作为工件的唯一方法是,如果项目本身的打包是pom。即使artifact 包装是pom,它也会尝试再次添加它(因此出现了我上面的错误)。

    所以对我来说唯一的解决方法似乎是添加另一个可能为空的文件作为我的工件,然后让它推送该文件。

    【讨论】:

    • 是的,当然因为制作其他包装类型没有意义。所以你总是需要一个 pom 文件(描述依赖项)和你想要打包的工件,即文件(tgz)。问题是为什么你为此编写了一个插件,因为 maven-assembly-plugin 已经可以创建一个 tgz 文件,是的,它将被上传到存储库,因此它与任何其他工件一样始终可用......这让你始终部署同样的方式..Nexus => 安装。没有特殊情况让空间更轻松?嗯,在一个有 20 GiB 大小的文件的项目中做到了这一点
    • “问题是为什么你为此编写了一个插件,因为 maven-assembly-plugin 已经可以创建一个 tgz 文件”——因为我们需要共享程序集插件的配置。我们有一个自定义插件,它实际上使用 MojoExecutor 来调用程序集插件,所以我们没有重写那部分。自定义生命周期很棒(我们使用它们),但我不知道除了 pom 继承之外共享这些插件的配置,我们不能在这种情况下使用它 - 由于其他原因已经继承了其他 pom。
    • 我们最后的解决方法是禁用 maven-install 和 maven-deploy 插件,因为对于我们这个特定项目的案例,我们不需要 nexus 中的工件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2011-09-23
    相关资源
    最近更新 更多