根据POM中的活动配置更改打包方式

46

我有一个使用Maven编译的项目。在pom.xml中声明了不同的配置文件。 对于其中一些配置文件,我更喜欢构建war文件,而对于其他配置文件,我更喜欢构建jar文件。我通常手动编辑pom.xml文件,将打包方式变量更改为

<packaging>war</packaging>
或者
<packaging>jar</packaging>

在执行a之前

$ mvn clean package -Pchosenprofile
我该如何告诉mvn每个配置文件对应的打包方式,以便我不需要编辑pom.xml文件?
3个回答

131

如果您想使用个人资料,可以使用类似以下的代码:

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    ..
    <packaging>${packaging.type}</packaging>

    <profiles>
        <profile>
            <id>webapp</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <packaging.type>war</packaging.type>
            </properties>
        </profile>
        <profile>
            <id>batch</id>
            <properties>
                <packaging.type>jar</packaging.type>
            </properties>
                </profile>
          </profiles>
</project>

17
那件事非常容易和愉快,它让我微笑了。谢谢,即使晚了一年 :). - matiasg
1
您可以通过将属性添加到全局属性中来省略默认配置文件。如果加载了替代配置文件,则默认属性将被覆盖。 - tgr
最初我认为这在多模块项目中不起作用,但它似乎可以 :-) - JasonPlutext
1
非常好的答案,帮了我很多。 - Caio
这太棒了,使用相同的pom.xml生成本地安装的Docker镜像或WAR包。太好了。 - Thibault Cuvillie

4

您是否查看了war插件的attachClasses配置设置?这个简单的设置可以让您在单个Maven执行中构建war和jar(默认情况下分类器为“classes”)。


这不是我想象中的,但它实际上解决了我的问题,并且相当容易。 - matiasg

1

我认为你做不到。

我能想到两个替代方案:

  • 为打包创建两个单独的模块,并根据配置文件调用其中一个
  • 将你的模块放在war中,并根据配置文件调整生命周期(包括/排除构建步骤)以生成jar或war

我更喜欢第二种方法 - 构建服务器可能会同时构建两者,而开发人员将使用适当的配置文件/设置跳过不需要的类型。


谢谢。我更喜欢attachClasses方法,因为它更简单,但在更复杂的情况下,我可能不得不采用类似的方法。 - matiasg
attachClasses(或类似)是我对第二点的想法 - 基本上,一个war是一个带有额外内容的jar包 - 而maven完全能够同时生成两者。 - ptyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接