Maven和配置文件:在两个不同的配置文件中使用相同的插件,并同时激活

时间:2015-10-22 19:21:44

标签: maven maven-profiles

我们使用frontend-maven-plugin在我们的构建中使用grunt和bower。使用Frontend Maven插件,我可以在本地安装NPM,使用Bower下载Java库,并运行Grunt来优化和混淆我的代码。

像这样简化:

<plugin>
  <groupId>com.github.eirslett</groupId>
  <artifactId>frontend-maven-plugin</artifactId>
  <version>0.0.24</version>
  <executions>
    <execution>
      <id>install node and npm</id>
      <goals> <goal>install-node-and-npm</goal> </goals>
      ...
    </execution>
    <execution>
      <id>npm-install</id>
      <goals> <goal>npm</goal> </goals>
      ...
    </execution>
    <execution>
      <id>bower-install</id>
      <goals> <goal>bower</goal> </goals>
      ...
    </execution>
    <execution>
      <id>grunt-build</id>
      <goals> <goal>grunt</goal> </goals>
      ...
    </execution>
  </executions>
</plugin>

请注意,最后一次执行是grunt-build,这是JavaScript文件连接在一起,优化(返回,注释和其他删除的东西)和模糊处理的地方。

这适用于版本。但是,开发人员希望在没有JavaScript文件连接,优化和混淆的情况下部署战争。这将有助于他们进行调试。为此,我们只需从此插件的配置中删除grunt-build执行部分。

我想使用配置文件来执行此操作。我可以有一个名为development的配置文件,允许开发人员在没有最后一节的情况下进行构建。我可以简单地复制并粘贴pom.xml文件的这一部分,删除最后一次执行,并将其放入单独的配置文件中。一切都完成了。

然而,的旧编程格言不会重复。我将在pom.xml中复制大约50行代码。

我想要做的是有一种方法来执行前三次执行,并且只有在不是开发构建时才执行第四次执行。我也会在这里有一些其他的咬合和褶皱。例如,我必须复制JavaScripts本身,而不是结果。但是,这很容易做到而且不会重复代码。

这会导致重复的代码,因为我必须使用两种配置来定义frontend-maven-plugin。一次为development个人资料,一次为标准版本。据我所知,我不能说,运行frontend-maven-plugin的这种配置,如果这不是开发构建,运行frontend-maven-plugin的这个实例,它只会做咕噜声的东西

有没有办法在pom.xm中两次定义同一个插件,并让Maven以正确的顺序运行这两个实例?

2 个答案:

答案 0 :(得分:3)

您很幸运,该插件的IEnumerable目标定义了skip属性,因此您只需在自定义配置文件中将此属性设置为grunt

因此,您需要创建一个配置文件true,将自定义属性development设置为skipGrunt,并将默认配置文件设置为true

然后,在false目标的插件配置中,您可以添加

grunt

这句话可以更加通用:当您需要跳过插件的特定执行时, 一般一个自定义<configuration> <skip>${skipGrunt}</skip> <!-- rest of configuration --> </configuration> 属性,您可以将其设置为{ {1}}。

答案 1 :(得分:3)

让我引用the Maven forum

  

我的看法是,如果一个人只是跳过配置文件作为解决每个条件情况的解决方案,那么构建将会像恐怖电影中的水弹一样成长为第二个头,你会真的后悔。

     

关键是配置文件通常是正确使用Maven的权宜之计。除非你知道自己要做什么,否则它们应该永远被视为“最后的手段”。

     

在我的情况下,[...]配置文件非常适用于此,但我现在可以确切地看到九头蛇现在适合野兽的位置,除非绝对必要,否则不打算再用它们做任何事情。

我已经使用了个人资料。我是第二个观点。

从概念的角度来看,你有两个项目,它们的大部分内容都是相同的。这就是Maven的POM层次结构及其继承发挥作用的地方:

product ... parent POM
  +- pom.xml ... contains build steps apart from Grunt and all other declarations 
  +- dev
  |    +- pom.xml ... almost empty since everything's inherited from parent
  |    +- ... sources, resources, etc. ...
  +- release
       +- pom.xml ... contains Grunt build step only, everything else's inherited from parent
                      redirecting <build>/<[[test]source|resource>/]|
                          [[test]output|testresource>/]directory> to ../dev/...

有关要重定向的所有构建目录,请参阅 POM参考中的The BaseBuild Element SetResourcesThe Build Element Set

请参阅Maven include another pom for plugin configuration

  

唯一正确的答案是使用继承。

我也是第二个。

如果您使用个人资料,我建议将其称为dev而不是development。你的开发人员将永远感恩。 :)