学习 Maven之Maven Enforcer plugin

1.Maven Enforcer plugin是什么鬼?

在说这个插件是什么前我们先思考这么一个问题:当我们开发人员进入项目组进行开发前,要准备开发环境,而领导总是会强调工具的统一,编译环境的统一。比如要求所有开发人员使用JDK1.8进行开发。

开发人员接下来就是去下载指定版本的JDK,然后开始开发。但是如果开发人员的机器配置比较多,有好几个版本的JDK,而他虽然下载了JDK1.8,但是忘记配置环境变量,很有可能他用了JDK1.6进行的编译。

问题有了,该如何解决? Maven Enforcer plugin就是来解决这类问题。Enforcer可以在项目validate时,对项目环境进行检查。

2.Maven Enforcer plugin怎么用?

Enforcer配置后默认会在validate后执行enforcer:enforce,然后对项目环境进行检查。拿上面对JDK的校验为例,我们在pom.xml中配置插件。

<?xml version="1.0" encoding="UTF-8"?>
<project>
...
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>1.4.1</version>
                <executions>
                    <execution>
                        <id>default-cli</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <phase>validate</phase>
                        <configuration>
                            <rules>
                                <requireJavaVersion>
                                    <message>
                                        <![CDATA[You are running an older version of Java. This application requires at least JDK ${java.version}.]]>
                                    </message>
                                    <version>[${java.version}.0,)</version>
                                </requireJavaVersion>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <properties>
        <java.version>1.8</java.version>
    </properties>

</project>

我本地配置没有JDK1.8,按照我的期望,执行maven命令时应该会失败。让我们来执行命令 mvn validate 会打出如下日志告知我们JDK版本过低。

qyfmac$ mvn validate
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] AppFuse Modular Application
[INFO] AppFuse Modular Application - Core
[INFO] AppFuse Modular Application - Web (Spring MVC)
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building AppFuse Modular Application 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-enforcer-plugin:1.4.1:enforce (enforce-versions) @ stock ---
[WARNING] Rule 1: org.apache.maven.plugins.enforcer.RequireJavaVersion failed with message:
You are running an older version of Java. This application requires at least JDK 1.8.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] AppFuse Modular Application ........................ FAILURE [  0.987 s]
[INFO] AppFuse Modular Application - Core ................. SKIPPED
[INFO] AppFuse Modular Application - Web (Spring MVC) ..... SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.886 s
[INFO] Finished at: 2015-09-22T15:37:04+08:00
[INFO] Final Memory: 16M/156M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.4.1:enforce (enforce-versions) on project stock: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

其实执行命令 mvn enforcer:enforce 也可以达到上面的效果。区别就是validate是maven全局命令,enforcer:enforce是只执行这个插件的命令。

这里要注意一点,执行enforcer:enforce时,id必须是default-cli(具体原因请参阅:http://stackoverflow.com/questions/24827194/maven-enforcer-plugin-missing-or-invalid-rules),否则会报

The parameters ‘rules‘ for goal org.apache.maven.plugins:maven-enforcer-plugin:1.4.1:enforce are missing or invalid

3.Maven Enforcer plugin标签详解

现在对这个插件的配置讲解一下。

<plugin>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
  <execution>
    <id>default-cli</id>         --一个执行实例的id
      <goals>
        <goal>enforce</goal>     --执行的命令
      </goals>
      <phase>validate</phase>    --执行的阶段
      <configuration>
        <rules>                  --规则
          <requireJavaVersion>   --JDK的版本
            <message>            --失败后提示消息
              <![CDATA[You are running an older version of Java. This application requires at least JDK ${java.version}.]]>
             </message>
             <version>[${java.version}.0,)</version>   --JDK版本规则
           </requireJavaVersion>
         </rules>
       </configuration>
    </execution>
  </executions>
</plugin>        

Enforcer的rules除了控制JDK版本,还有很多其他规则,甚至可以通过它的接口自定义。

You may also create and inject your own custom rules by following the maven-enforcer-rule-api instructions.

我们再写一个例子。比如除了需要限制JDK外,我们还要限定maven版本,项目不得包含TestNG依赖,操作系统必须是mac os x 64位,项目版本号在执行install时必须是正式版本。

直接上代码:

<?xml version="1.0" encoding="UTF-8"?>
<project>
...
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-enforcer-plugin</artifactId>
                <version>1.4.1</version>
                <executions>
                    <execution>
                        <id>default-cli</id>
                        <goals>
                            <goal>display-info</goal>
                            <goal>enforce</goal>
                        </goals>
                        <phase>validate</phase>
                        <configuration>
                            <rules>
                                <requireMavenVersion>
                                    <message>
                                        <![CDATA[You are running an older version of Maven. This application requires at least Maven ${maven.version}.]]>
                                    </message>
                                    <version>[${maven.version},)</version>
                                </requireMavenVersion>
                                <requireJavaVersion>
                                    <message>
                                        <![CDATA[You are running an older version of Java. This application requires at least JDK ${java.version}.]]>
                                    </message>
                                    <version>[${java.version}.0,)</version>
                                </requireJavaVersion>

                                <bannedDependencies>
                                    <!--是否检查传递性依赖(间接依赖)-->
                                    <searchTransitive>true</searchTransitive>
                                    <excludes>
                                        <!--groupId[:artifactId][:version][:type][:scope][:classifier]-->                                         <exclude>org.testng:testng</exclude>
                                    </excludes>
                                    <message>don‘t use TestNG,must use JUnit</message>
                                </bannedDependencies>
                                <requireOS>
                                    <name>mac os x</name>
                                    <family>mac</family>
                                    <arch>x86_64</arch>
                                    <version>10.10.3</version>
                                </requireOS>
                                <requireProperty>
                                    <property>project.version</property>
                                    <message>"Project version must be specified."</message>
                                    <regex>.*(\d|-SNAPSHOT)$</regex>
                                    <regexMessage>"Project version must end in a number or -SNAPSHOT."</regexMessage>
                                </requireProperty>
                            </rules>
                        </configuration>
                    </execution>
                    <execution>
                        <id>enforce-install</id>
                        <goals>
                            <goal>enforce</goal>
                        </goals>
                        <phase>install</phase>
                        <configuration>
                            <rules>
                                <requireProperty>
                                    <property>project.version</property>
                                    <message>"Project version must be specified."</message>
                                    <regex>.*(\d)$</regex>
                                    <regexMessage>"Project version must end in a number."</regexMessage>
                                </requireProperty>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        ...
        <!--测试放开-->
        <!--<dependency>-->
            <!--<groupId>org.testng</groupId>-->
            <!--<artifactId>testng</artifactId>-->
            <!--<version>6.1.1</version>-->
            <!--<scope>test</scope>-->
        <!--</dependency>-->
    </dependencies>
    <properties>
        <java.version>1.7</java.version>
        <maven.version>3.3.3</maven.version>
    </properties>
</project>

这里要说一下requireOS了,不支持表达式,必须准确的写一个版本号,个人认为这个不好,不过可以把version注释掉,不校验操作系统的版本。

如果某些情况下不检查环境,可以在maven命令上加一个 -Denforcer.skip=true 来跳过enforcer插件执行。
例如:mvn clean validate -Denforcer.skip=true

更多神奇的配置方式还请参阅官方网站 :http://maven.apache.org/enforcer/maven-enforcer-plugin/index.html

时间: 2024-07-29 00:45:12

学习 Maven之Maven Enforcer plugin的相关文章

关于maven的规则插件:Maven Enforcer plugin

Maven提供了Maven-Enforcer-Plugin插件,用来校验约定遵守情况(或者说校验开发环境).比如JDK的版本,Maven的版本,开发环境(Linux,Windows等),依赖jar包的版本等等 看有些文章说,这个插件检查的是maven最终使用的版本情况,我不认同,因为这个插件有个设置是:是否检查传递依赖 如果不设置,就有可能失去对属于间接依赖的插件的检查(假如这个依赖插件只出现在间接依赖里),如果设置了,就会检查插件的多个版本 1.是maven智能选择后的判断 2.不可以传递 3

maven 学习---部署基于Maven的war文件到Tomcat

在本教程中,我们将学习如何使用Maven的Tomcat插件打包并部署一个WAR文件到Tomcat(Tomcat的6和7. 要用到工具: Maven 3 Tomcat 6.0.37 Tomcat 7.0.53 Tomcat 7发布URL = http://localhost:8080/manager/text命令 = mvn tomcat7:deploy Tomcat 6发布 URL = http://localhost:8080/manager/命令 = mvn tomcat6:deploy 1

Maven出现错误No plugin found for prefix &#39;jetty&#39; in the current project and in the plugin groups的问题解决

只需在maven的setting.xml文件上加入如下节点: <pluginGroups> <pluginGroup>org.mortbay.jetty</pluginGroup> </pluginGroups> setting.xml文件放在maven运行文件夹的conf文件夹下. 如果不想像上面增加额外的节点,可以通过以下的命令启动: mvn org.mortbay.jetty:maven-jetty-plugin:run Maven出现错误No plu

Maven学习一:Maven安装配置

想要安装 Apache Maven 在Windows 系统上, 需要下载 Maven 的 zip 文件,并将其解压到你想安装的目录,并配置 Windows 环境变量. 所需工具 : JDK 1.8 Maven 3.3.9 Windows 10 注Maven 3.2 要求 JDK 1.6 或以上版本, 而 Maven 3.0/3.1 需要 JDK 1.5 或以上 1. JDK 和 JAVA_HOME 确保已安装JDK,并 "JAVA_HOME" 变量已加入到 Windows 环境变量.

备忘:maven 错误信息: Plugin execution not covered by lifecycle configuration

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVers

Rhythmk 学习 Hibernate 01 - maven 创建Hibernate 项目之 增删改查入门

1.环境: Maven :3.1.1 开发工具:Spring Tool Suite 数据库 : Mysql  5.6 2.项目文件结构 文件代码: 2.1 .pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.ap

Maven出现错误No plugin found for prefix &#39;jetty&#39; in the current

Maven出现错误No plugin found for prefix 'jetty' in the current project and in the plugin groups的问题解决 只需在maven的setting.xml文件上加入如下节点: <pluginGroups>       <pluginGroup>org.mortbay.jetty</pluginGroup>   </pluginGroups> Maven出现错误No plugin

Java学习篇之---Maven开发跳过单元测试

Maven开发跳过单元测试 最近做Maven项目,因为工程很庞大,每次单元测试会耗去很多时间,本着节省时间的原则,想要跳过单元测试部分,于是网上找了两种方案,分别是在DOS环境下操作Maven和在eclipse中操作Maven. Maven 提供了跳过单元测试的能力,只需要使用 Surefire 插件的 skip 参数. DOS下,只要简单的给任何目标添加 maven.test.skip 属性就能跳过测试: $ mvn install -Dmaven.test.skip=true ... [IN

Maven学习总结(二)——Maven项目构建过程练习

Maven学习总结(二)——Maven项目构建过程练习 上一篇只是简单介绍了一下maven入门的一些相关知识,这一篇主要是体验一下Maven高度自动化构建项目的过程 一.创建Maven项目 1.1.建立Hello项目 1.首先建立Hello项目,同时建立Maven约定的目录结构和pom.xml文件 Hello | --src | -----main | ----------java | ----------resources | -----test | ---------java | -----