Maven Profile的使用
【故事背景】Maven在执行的过程中,有时候我们想要跳过某些插件,暂时不执行它,有时候我们需要执行它。例如JsHint.git/project/info/pom.xml: com.cj.jshintmojo jshint-maven-plugin 1.3.0 lint
故事背景:
Maven在执行的过程中,有时候我们想要跳过某些插件,暂时不执行它,有时候我们需要执行它。例如JsHint.
git/project/info/pom.xml:
<plugin>
<groupId>com.cj.jshintmojo</groupId>
<artifactId>jshint-maven-plugin</artifactId>
<version>1.3.0</version>
<executions>
<execution>
<goals>
<goal>lint</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
<configuration>
<version>2.4.1</version>
<options/>
<globals/>
<configFile>src/main/config/libs/jshint.conf.js</configFile>
<directories>
<directory>src/main/js</directory>
</directories>
<excludes>
<directory>src/main/js/chart/metadata/properties</directory>
<directory>src/main/js/geo</directory>
</excludes>
<reporter>jslint</reporter>
<reportFile>${project.build.directory}/jshint.xml</reportFile>
<failOnError>true</failOnError>
</configuration>
</plugin>
但是JsHint没有提供类似于<skip>boolean</skip>或者<ignore>boolean</ignore> 这样的API。有些插件提供的有,我们通过这个API开关可以很容易的选择是否执行这个插件。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<id>copy cvom libs</id>
<phase>initialize</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.xxx.viz</groupId>
<artifactId>xxx.viz.vizcharts</artifactId>
<classifier>main</classifier>
<version>${cvom.version}</version>
<type>zip</type>
<overWrite>true</overWrite>
<destFileName>xxx.viz.vizcharts-${cvom.version}-main.zip</destFileName>
</artifactItem>
</artifactItems>
<outputDirectory>${cvom.libs.path}</outputDirectory>
<skip>true</skip> //这里提供了一个可以skip掉该插件执行过程的API
</configuration>
</execution>
</executions>
</plugin>
所以这个时候,Maven profile用处到了。
git/project/pom.xml
git/project/info/pom.xml
git/project/viz/pom.xml
git/project/container/pom.xml
project/pom.xml是Parent pom flle, 其他几个是子pom
<modelVersion>4.0.0</modelVersion>
<groupId>com.sap.viz</groupId>
<artifactId>sap.viz.parent</artifactId>
<version>5.1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>viz</module>
<module>info</module>
<module>container</module>
</modules>
具体使用如下:
在其他三个child pom中,我只写两个示例:
git/project/info/pom.xml
profile中有一个叫activeByDefault的键值对,通过赋值boolean来控制id对应的profile所包裹的插件是否执行,true表示“默认执行”,false表示“不执行”
<profiles>
<profile>
<id>jshint</id>
<activation>
<activeByDefault>true</activeByDefault>//默认值为true,表示是激活状态,执行该profile所包裹的插件
</activation>
<build>
<plugins>
<plugin>
<groupId>com.cj.jshintmojo</groupId>
<artifactId>jshint-maven-plugin</artifactId>
<version>1.3.0</version>
<executions>
<execution>
<goals>
<goal>lint</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
<configuration>
<version>2.4.1</version>
<options/>
<globals/>
<configFile>src/main/config/libs/jshint.conf.js</configFile>
<directories>
<directory>src/main/js</directory>
</directories>
<excludes>
<directory>src/main/js/chart/metadata/properties</directory>
<directory>src/main/js/geo</directory>
</excludes>
<reporter>jslint</reporter>
<reportFile>${project.build.directory}/jshint.xml</reportFile>
<failOnError>true</failOnError>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
git/project/viz/pom.xml, 这里的profile的代码和info中的一样,同理container/pom.xml
<profiles>
<profile>
<id>jshint</id>
<activation>
<activeByDefault>true</activeByDefault>//默认值为true,表示是激活状态,执行该profile所包裹的插件
</activation>
<build>
<plugins>
<plugin>
<groupId>com.cj.jshintmojo</groupId>
<artifactId>jshint-maven-plugin</artifactId>
<version>1.3.0</version>
<executions>
<execution>
<goals>
<goal>lint</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
<configuration>
<version>2.4.1</version>
<options/>
<globals/>
<configFile>src/main/config/libs/jshint.conf.js</configFile>
<directories>
<directory>src/main/js</directory>
</directories>
<excludes>
<directory>src/main/js/chart/metadata/properties</directory>
<directory>src/main/js/geo</directory>
</excludes>
<reporter>jslint</reporter>
<reportFile>${project.build.directory}/jshint.xml</reportFile>
<failOnError>true</failOnError>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
请注意一点,info/pom.xml, viz/pom.xml和container/pom.xml中,包裹JsHint的profile id 都是一致的,名为"jshint".
那么问题来了,你讲了半天,我怎么“不执行”JsHint插件呢?
$ mvn help:active-profiles -P !jshint会发现被激活的profile列表中没有那三个id为jshint的profile, 当然JsHint插件在三个pom.xml中就都没有被执行
但是直接运行
$ mvn help:active-profiles
会发现被激活的profile列表中有id为jshint的三个profile,说明JsHint插件在三个pom.xml中会被执行
总结:
通过拥有相同的id的profile包裹某个插件,可以在cmd中用"mvn -P !profile_id "来取消对应id的profile的激活,达到跳过执行不同pom中某个插件的目的。
附:
想让profile处于默认激活状态,那么activeByDefault的值要明写为true。
<activation>
<activeByDefault>true</activeByDefault>
</activation>
不能写成从parent pom中全局属性继承的true值。
parent pom定义属性值
<properties>
<jshint.active>true</jshint.active>
</properties>
child pom继承parent pom属性值
<activation>
<activeByDefault>${jshint.active}</activeByDefault>
</activation>
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
还有一种profile的用法
<profiles>
<profile>
<id>jshint</id>
<activation>
<activeByDefault>false</activeByDefault>
<property>
<name>jshint.exec</name>
<value>true</value>
</property>
</activation>
<properties>
<my.name>Zhou Ziyin</my.name>
</properties>
</profile>
</profiles>
<my.name>zdd</my.name>是从parent pom中定义的属性值,运行
$ mvn -Djshint.exec=true
那么这个pom中的该profile会被激活,仅仅只是这个。它同时会使<my.name>Zhou Ziyin</my.name>生效,并且是这个pom中profile外的其他地方引用该值之前已经改变。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)