故事背景:

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外的其他地方引用该值之前已经改变。






Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐