2014-03-19 52 views
2

我有一个由几个子模块组成的maven项目。构建一个子模块后执行maven插件

我们称之为子模块sharedwebapp。该项目通常由位于父目录中的父POM构建。所以目录布局看起来像:

myproject/pom.xml 
myproject/shared/pom.xml 
myproject/webapp/pom.xml 

我有一个特定的插件,我想从顶层目录中的命令行可执行。我不希望它在任何阶段默认运行。所以通常我想运行mvn clean install,在这种情况下插件不应该执行。但是我也希望能够说0123'并且执行应该在这种情况下运行,但是执行应该只运行一次webapp子模块。当我在命令行中指定此操作时,不应为父POM或shared子模块执行该执行。

我遇到的问题是,如果我在父POM中定义执行,它会为每个子模块重复运行。如果我在webapp POM中定义执行,则无法通过Maven的命令行调用进行访问。

我想在一个Maven的COMAND做到这一点和单指令还必须能够建立&运行阶段的所有子模块 - 不仅仅是webapp子模块 - 因此-pl命令行选项不起作用对于这种情况?

相关:Running a specific Maven plugin goal from the command line in a sub-module of a multi-module reactor project

这种事可能吗?如果这是不可能的,我会接受一个答案说明。

+5

在webapp中创建一个配置文件,并通过激活的配置文件运行它。否则,我不明白为什么你需要从命令行和构建内运行这个插件? – khmarbaise

+0

@khmarbaise是对的,这绝对是你想要的。只需在webapp中创建一个单独的配置文件,将您的目标设为您想要的任何阶段,然后使用已定义的配置文件从父项运行mvn命令。 -P选项甚至传播到子模块。 – jholusa

+0

配置文件方法工作得非常好,可以让我从顶层POM访问执行 - 谢谢。然而,我找不到一个解决方案,它允许我从命令行**调用执行,而没有将它绑定到一个阶段。我想知道这是否可能。 – amoe

回答

0

该插件必须在父pom中定义为可在父级执行。但是,如果在父项中定义,则插件将针对所有模块执行。 由于这是你的插件(com.mycompany:myplugin),你可以在插件实现中定义一个“no-op”配置选项。然后,在每个你希望插件什么都不做的地方,你使用这个配置选项。

举例来说,docker-maven-plugin就是这样做的。如果您使用:

<configuration> 
    <skipDocker>true</skipDocker> 
</configuration> 

插件不会为该pom执行。