Maven指南

28次阅读

共计 14265 个字符,预计需要花费 36 分钟才能阅读完成。


1 什么是 maven


    Maven 项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的
    可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。Maven 这个
    单词来自于意第绪语(犹太语),意为知识的积累,最初在 Jakata Turbine 项目中用来简化构建过程。当时
    有一些项目(有各自 Ant build 文件),仅有细微的差别,而 JAR 文件都由 CVS 来维护。于是希望有一种标准
    化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式
    在多个项目中共享 JARs。Maven 是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个
    项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行
    定义在生命周期阶段 (phase) 中插件 (plugin) 目标 (goal) 的逻辑。当你使用 Maven 的时候,你用一个明确定
    义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义
    的)插件。Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有
    序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的
    插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。此外,Maven 能够很方便的帮你管理
    项目报告,生成站点,管理 JAR 文件,等等。

1.1 安装


   maven 官网:https://maven.apache.org/
   maven 下载地址:https://maven.apache.org/download.cgi

如图:

    
选择其中一个下载
下载完成之后解压
    
可以看到如下目录:bin:  该目录包含 maven 脚本。包含了 mvn 运行的脚本,在此目录下输入任意一条命令就是调用这些脚本
    boot: 该目录只有一个 plexus-classworlds-2.5.2.jar,该 jar 是 maven 的类加载框架用来加载自己的类
          库,相对于默认的 java 类加载器,提供了更丰富的语法及配置
    config: 该目录包含 maven 配置文件,可以全局定制 maven 行为。通常,settings.xml 复制到~/.m2/ 目录下,在用户范围内定制 maven 行为。编译工具会优先去~/.m2 目录下读取 settings.xml 文件,如果没有
            读取到才会去 maven 的安装目录下读取 settings.xml 文件。lib: 该目录包含了 maven 运行时需要的 java 类库。其中注意的一点是:可以在 lib 包下找到 maven 内置的超
         级 POM,一般存放在名叫 maven-model-builder 的 jar 包里面

如果想在 cmd 上直接运行,需要设置环境变量中的 path。这里就不一一说明了。

1.2 本地仓库的安装


   修改 maven 目录下的 config 的 setting.xml 把 <localRepository> 打开,标签里面设置本地仓库的地址,那么之后所有项目的 jar 包都装放在这个目录下
   
   如:<localRepository>D:\Inkstone\maven\repository</localRepository>
                        

创建一个 maven 项目


先创建 一个根目录, 如果 d:\example
在 d:\example 目录下运行 mvn archetype:generate
然后会在这个目录下生成一个项目的骨架

如图:



pom 文件:

 <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">
     <modelVersion>4.0.0</modelVersion>

     <groupId>com.sutpc.ioc</groupId>
     <artifactId>ioc_diciflow</artifactId>
     <version>SNAPSHOT-0.0.1</version>
     
     <dependencies>
        <dependency>
            <groupId>com.sutpc</groupId>
            <artifactId>framework-core</artifactId>
            <version>2.1.1</version>
        </dependency>
     <dependencies>
 </project>
 
项目的坐标
    groupId: 表示项目的名称  
    artifactId:表示项目的模块名称,建议使用项目的名称 - 模块名称来表示
    version:表示这个项目的版本名称

dependencies:项目的依赖

1.3 创建代码和测试代码


源代码应该放置到 src/main/java 中
源代码的资源文件应该放置在 src/main/resources 文件夹中
测试代码应该放置到 src/test/java 中
测试代码的资源文件应该放置在 src/test/resources 文件夹中

1.4 运行 mvn


mvn clean --> 表示运行清理操作(会默认把 target 文件夹中的数据清理)mvn clean compile--> 表示先运行清理之后运行编译,会见代码编译到 target 文件夹中
mvn clean test--> 运行清理和测试
mvn clean package--> 运行清理和打包
mvn clean install--> 运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用
mvn clean deploy--> 运行清理和发布(发布到私服上面)

1.5 mvn 常用命令


mvn help:describe:参数: 
         1. -Dplugin=pluginName
         2. -Dgoal(或 -Dmojo)=goalName: 与 -Dplugin 一起使用, 它会列出某个插件的 goal 信息
            这个命令会告诉你某个插入有哪些 goal 及其相关的参数如果觉得不够详细, 同样可以加
            -Ddetail.
         注: 一个插件 goal 也被认为是一个“Mojo”)
         
mvn archetype:generate: 创建 maven 项目,之前是使用 mvn archetype:create -DarchetypeArtifactId=
                        maven-archetype-quickstart -DgroupId=com.ryanote -Dartifact=common,
                        命令太冗长了,现在只需输入 archetype:generate, 剩下的就是做”选择题”了

mvn tomcat:run:在对应目录下运行 mvn tomat:run 命令,就可以在浏览器里运行查看了
    参数:1. -Dmaven.test.skip(=true)  跳过测试
         2. -Dmaven.tomcat.port=9090  指定端口
         3. -Dmaven.test.failure.ignore=true  忽略测试失败
         
    如何使用这个命令:先在 pom 文件添加依赖:<!-- tomcat7 插件 maven 命令 tomcat7:run 启动项目 -->
    <plugin>
          <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>
          <configuration>
            <port>8080</port>
            <path>/${project.artifactId}</path>
            <uriEncoding>${project.build.sourceEncoding}</uriEncoding>
          </configuration>
    </plugin>
    告诉 pom 项目的 resourse 目录
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
              <include>**/*.xml</include>
              <include>**/*.sql</include>
              <include>**/*.ftl</include>
            </includes>
            <filtering>false</filtering>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    然后直接运行 mvn tomcat:run,记得把 packaging 改成 war
        
mvnDebug tomcat:run:主要用来远程测试, 它会监听远程测试用的 8000 端口, 在 eclipse 里打开远程测试后, 它
                     就会跑起来了, 设断点, 调试, 一切都是这么简单. 上面提到的那几个参数在这里同样适用.
    参数:1. -Dmaven.test.skip(=true)  跳过测试
         2. -Dmaven.tomcat.port=9090  指定端口
         3. -Dmaven.test.failure.ignore=true  忽略测试失败                         

mvn dependency:sources:运行一下, 你项目里所依赖的 jar 包的源码就都有了
mvn archetype:create  -DgroupId=packageName  -DartifactId=projectName:创建 mavne 项目
mvn compile: 编译源代码
mvn test-compile: 编译测试代码
mvn test: 运行测试     
mvn site: 生成项目相关信息的网站
mvn package: 生成 target 目录,编译、测试代码,生成测试报告,生成 jar/war 文件
mvn install:在本地 Repository 中安装 jar
mvn clean:清除产生的项目  
mvn eclipse:eclipse:生成 eclipse 项目
mvn idea:idea:生成 idea 项目
mvn -Dtest package:组合使用 goal 命令,如只打包不测试
mvn test-compile:编译测试的内容
mvn jar:jar:只打 jar 包
mvn test -skipping compile -skipping test-compile:只测试而不编译,也不测试编译
mvn eclipse:clean:清除 eclipse 的一些系统设置
mvn -Dwtpversion=1.0 eclipse:eclipse 生成 Wtp 插件的 Web 项目
mvn -Dwtpversion=1.0 eclipse:clean 清除 Eclipse 项目的配置信息(Web 项目)
mvn eclipse:eclipse: 将项目转化为 Eclipse 项目
mvn -e: 显示详细错误 信息.
mvn validate: 验证工程是否正确,所有需要的资源是否可用。mvn test-compile: 编译项目测试代码。。mvn integration-test: 在集成测试可以运行的环境中处理和发布包。mvn verify: 运行任何检查,验证包是否有效且达到质量标准。mvn generate-sources: 产生应用需要的任何额外的源代码,如 xdoclet。同时发布第三方 jar 到本地库和远程库:mvn deploy:deploy-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar -DrepositoryId=maven-repository-inner -Durl=ftp://xxxxxxx/opt/maven/repository/

发布第三方 Jar 到本地库中:mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar

特别关注

package、install、deploy 的区别

mvn clean package 依次执行了 clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。mvn clean install 依次执行了 clean、resources、compile、testResources、testCompile、test、jar(打包)、install 等 8 个阶段。mvn clean deploy 依次执行了 clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy 等9个阶段。也就是说:package: 命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行 jar 包(war 包或其它形式
            的包)布署到本地 maven 仓库和远程 maven 私服仓库
    install: 命令完成了项目编译、单元测试、打包功能,同时把打好的可执行 jar 包(war 包或其它形式的
            包)布署到本地 maven 仓库,但没有布署到远程 maven 私服仓库
    deploy: 命令完成了项目编译、单元测试、打包功能,同时把打好的可执行 jar 包(war 包或其它形式的
            包)布署到本地 maven 仓库和远程 maven 私服仓库

2 依赖


2.1 依赖包的查询


1. 所有的依赖都是通过坐标来进行存储的(GAV-->groupId、artifactId、version)2. 有一些网上的仓库提供了坐标的查询(http://mvnrepository.com)3. 通过 <dependencies> 设置依赖

maven 是如何搜索依赖的?maven 首先会在本地仓库查询, 如果本地仓库没有,就去中央仓库查询
  

2.2 依赖的范围


依赖的范围指的就是 <scope> 标签的可选配置:compile、test、provided、runtime、system、import

1. compile: 默认值,无须显示指定。对于编译、测试、运行三种 classpath 都有效,如 spring-core 无论是在编译,测试,还是运行都会被用到,因此 spring-core 必须是编译范围
            
2. test:只对测试 classpath 有效,在编译主代码和项目运行时,都将无法使用该依赖,最典型的例子就是 Junit, 构件
          在测试时才需要,所以它的依赖范围是测试,因此它的依赖范围需要显示指定为 <scope>test</scope> , 当然
          不显示指定依赖范围也不会报错,但是该依赖会被加入到编译和运行的
          classpath 中。对于资源来说是一种浪费。3. provided:只对编译和测试的 classpath 有效,对运行的 classpath 无效,典型的就是 servlet-api,编译和测试该
              项目的时候需要该依赖,但是在运行时,web 容器已经提供的该依赖,所以运行时就不再需要此依赖,如果
              不显示指定该依赖范围,并且容器依赖的版本和 maven 依赖的版本不一致的话,可能会引起版本冲突

4. runtime:只对测试和运行的 classpath 有效,对编译的 classpath 无效,典型例子就是 JDBC 的驱动实现,项目主代码
             编译的时候只需要 JDK 提供的 JDBC 接口,只有在测试和运行的时候才需要实现上述接口的具体 JDBC 驱动

5. system:与 classpath 的关系与 provided 依赖范围完全一致,但是系统依赖范围必须通过配置 systemPath 元素来显
            示指定依赖文件的路径,此类依赖不是由 maven 仓库解析的,而且往往与本机系统绑定,可能造成构件的不可
            移植,因此谨慎使用,systemPath 元素可以引用环境变量:<dependency> 
                <groupId>javax.sql</groupId>
                <artifactId>jdbc-stext</artifactId> 
                <version>2.0</version>
                <scope>system</scope>
                <systemPath>${java.home}/lib/rt.jar</systemPath> 
           </dependency>

6. import: 不会对三种 classpath 产生影响,该依赖范围只能与 dependencyManagement 元素配合使用,其功能为将目标
           pom 文件中 dependencyManagement 的配置导入合并到当前 pom 的 dependencyManagement 中
           如:有一个父项目为 a,现在有一个项目 c 要使用 a 项目,可以这样
            <dependencyManagement>
                   <dependencies>
                       <!-- 此处继承了 a 和 b 两个项目,type 为 pom,scope 为 import -->
                       <dependency>
                           <groupId>com.cbm.stu</groupId>
                           <artifactId>maven-parent-a</artifactId>
                           <version>1.0.0</version>
                           <type>pom</type>
                           <scope>import</scope>
                       </dependency>
                       <dependency>
                           <groupId>com.cbm.stu</groupId>
                           <artifactId>maven-parent-b</artifactId>
                           <version>1.0.0</version>
                           <type>pom</type>
                           <scope>import</scope>
                       </dependency>
                   </dependencies>
               </dependencyManagement>

               <dependencies>
                   <!-- 从继承的父项目中继承依赖 -->
                   <dependency>
                       <groupId>junit</groupId>
                       <artifactId>junit</artifactId>
                   </dependency>
                   <dependency>
                       <groupId>org.mybatis</groupId>
                       <artifactId>mybatis</artifactId>
                   </dependency>
                   <dependency>
                       <groupId>mysql</groupId>
                       <artifactId>mysql-connector-java</artifactId>
                   </dependency>
               </dependencies>

2.3 依赖的传递性


    现在有 maven 项目 A, 项目 B 依赖 A, 项目 C 依赖 B. 这时如果执行项目 C 时,会自动把 A、B 依赖都下载到 c 项目的 jar 包文件夹。这就依赖的传递性
     
    如果现在不想执行 C 把 A 下载过来,使用 <exclusions> 标签
     <dependencies>
         <dependency>
             <groupId>B</groupId>
             <artifactId>B</artifactId>
             <version>0.0.1</version>
              <exclusions>
                 <exclusion>
                   <!-- 被排除的依赖包坐标 -->
                   <groupId>A</groupId>
                   <artifactId>A</artifactId>
                   <version>0.0.1</version>
                 </exclusion>
              </exclusions>
        </dependency>
     </dependencies>
     

2.3.1 依赖冲突与解决


依赖冲突:有一个项目 A, 通过不同依赖传递路径依赖于 D,如果在不同路径下传递过来的 D 版本不同,那么应该导入哪个版本下
         的包?1. 如果依赖的路径长度不现,则“短路优先”:A -> B -> C -> D(version 0.0.1)
              A -> F -> D(version 0.0.2)        
            则 A 依赖于 D(version 0.0.2)2. 依赖如果长度相同,则“先声明优先”A -> B -> D(version 0.0.1)
              A -> F -> D(version 0.0.2)        
            在项目 A 中的 <dependencies> 中,b,f 哪个先则 A 依赖那个路径的 D
           

2.4 聚合和继承



如上图所示:

通过 module 聚合项目.
注意:如果聚合的项目和其它的项目在同级模块中,需要使用../xx 文件夹名来设置

对于依赖的继承而言,都需要通过 </dependencyManagement> 来完成管理,如果不管理子类会全部继承,这种可能会导致一些
模块存在不需要的依赖

2.5 版本管理


< 主版本 >.< 次版本 >.< 增量版本 >-< 里程碑版本 >   
     主版本:表示框架的变动,如 Maven2 和 Maven1 相去甚远;Struts1 和 Struts2 采用了不同的架构。次版本:表示较大范围的功能增加和变化,及 Bug 修复。例如 Nexus 1.5 较 1.4 添加了 LDAP 的支持,并且修复了
            很多 Bug, 但是从总体架构来说,没有什么变化。小版本号:在分支版本上面进行 bug 的修复
 
 里程碑:SNAPSHOT-->alpha-->beta-->release-->GA

3 仓库


maven 项目使用的仓库一共有如下几种方式:

1. 中央仓库,这是默认的仓库
2. 镜像仓库,通过 sttings.xml 中的 settings.mirrors.mirror 配置
3. 全局 profile 仓库,通过 settings.xml 中的 settings.repositories.repository 配置
4. 项目仓库,通过 pom.xml 中的 project.repositories.repository 配置
5. 项目 profile 仓库,通过 pom.xml 中的 project.profiles.profile.repositories.repository 配置
6. 本地仓库

3.1 本地仓库


通过设置 maven 目录下 config 中的 setting.config
<localRepository>D:\Inkstone\maven\repository</localRepository>

3.2 镜像仓库


maven 目录下 config 中的 setting.config,内容如下:

<settings>
  <mirrors>
    <mirror>
      <id>settings_mirror</id>
      <url>https://maven.aliyun.com/repository/public</url>
      <mirrorOf>central</mirrorOf>
    </mirror>
  </mirrors>
</settings>

3.3 全局 profile 仓库


maven 目录下 config 中的 setting.config 中的 setting 的节点内增加

<profiles>
  <profile>
  <id>s_profile</id>
  <repositories>
    <repository>
      <id>settings_profile_repo</id>
      <name>netease</name>
      <url>http://mirrors.163.com/maven/repository/maven-public/</url>
      <releases>
         <enabled>true</enabled>
      </releases>
      <snapshots>
         <enabled>true</enabled>
      </snapshots>
    </repository>
  /repositories>
  </profile>
</profiles>

3.4 项目仓库


在 project 中增加如下配置:

 <repositories>
   <repository>
     <id>pom_repositories</id>
     <name>local</name>
     <url>http://localhost:8081/nexus/content/groups/public/</url>
     <releases>
       <enabled>true</enabled>
     </releases>
     <snapshots>
       <enabled>true</enabled>
     </snapshots>
   </repository>
 </repositories>
  • 由于我们改变了 id 的名字,所以仓库地址无所谓,使用相同的地址也不影响测试。

3.5 配置项目 profile 仓库


<profiles>
  <profile>
    <id>p_profile</id>
    <repositories>
      <repository>
        <id>pom_profile_repo</id>
        <name>local</name>
        <url>http://10.18.29.128/nexus/content/groups/public/</url>
        <releases>
          <enabled>true</enabled>
        </releases>
        <snapshots>
          <enabled>true</enabled>
        </snapshots>
      </repository>
    </repositories>
  </profile>
</profiles>

3.6 特别注意

  • settings_mirror 的优先级高于 central
  • settings_profile_repo 优先级高于 settings_mirror
  • settings_profile_repo 优先级高于 pom_repositories
  • settings_profile_repo 优先级高于 pom_profile_repo
  • pom_profile_repo 优先级高于 pom_repositories
  • pom_repositories 优先级高于 settings_mirror

即:local_repo > settings_profile_repo > pom_profile_repo > pom_repositories > settings_mirror > central

项目中依赖的搜索顺序:https://my.oschina.net/polly/…


3.6 本地仓库


3.6.1 nexus 的安装


   关于这个安装,我在官网找到了安装包,但不知道为什么就是下载不了,无论是最新的还是老版本的。解决方案:百度
   百度结果:找到一个百度云的链接,不过版本有点老。nexus-2.12.0-01-bundle
   链接:https://pan.baidu.com/s/1yVUJG4Yb9F0mY5GcSQj5YA 密码:8j5n    
   如果失效, 加入我们 qq 群:709571289
   下载完成后解压
   nexus-2.12.0-01-bundle\nexus-2.12.0-01\bin\jsw 到了这个目录就看你是什么系统了,点击相应的系统启动脚本
   就 ok 了。

### 3.6.2 仓库


如上图所示:

  • host 仓库:表示内部项目的发布仓库

    1. 3rd party:表示第三方依赖的仓库,这个数据通常是由内部人员自行下载之后发布仓库
    2. Snapshots: 表示内部的 SNAPSHOTS 模块仓库
    3. Releases:表示内部的模块中 releases 模块发布仓库
  • proxy 的仓库,从远程中央仓库中寻找数据的仓库

    1. Apache Snapshots: 代理 ApacheMaven 仓库快照版本的构件仓库
    2. Central Snapshots: 代理 CodehausMaven 仓库的快照版本构件的仓库
    3. Central: 代理 maven 中央仓库中发布版本构件的仓库

3.6.3 设置:


1. 配置镜像
      <mirrors>
           <mirror>
            <id>central</id>
            <mirrorOf>*</mirrorOf>
            <name>Human Readable Name for this Mirror.</name>
            <url>http://localhost:8081/nexus/content/groups/public/</url>
         </mirror>
      </mirrors>
      
      *: 表示所有仓库的信息都从这里获取,还可以使用 nexus.central, 这个表示 id 为 nexus 和 central 的仓库才走镜像
      
2. 配置仓库  
       <profiles>
           <profile>
             <id>central-repos</id>
          <repositories>
               <repository>
                <id>central</id>
                 <name>Central</name>
                 <url>http://central</url>
                    <releases><enable>true</enable></releases>
                   <snapshots>
                       <enabled>true</enabled>
                    </snapshots>
               </repository>
            </repositories>
        </profile>   
        
  url: 配置了这个镜像之后,这个 url 就没有意义了
  release:打开对 release 的依赖。默认打开
  snapshots: 打开快照的依赖,默认没有打开

3.6.3 项目的发布


1. 设定 release 工厂和 snapshots 工厂
      <distributionManagement>
            <snapshotRepository>
                <id>example-snapshots</id>
                <name>example Project SNAPSHOTS</name>
                <url>http://192.168.0.199:8081/nexus/content/repositories/MyUserReposSnapshots/</url>
            </snapshotRepository>     
                  <repository>
                      <id>example-releases</id>
                      <name>example Project Release</name>
                      <url>http://192.168.0.199:8081/nexus/content/repositories/MyUserReposRelease/</url>
                  </repository>      
              </distributionManagement>
2. 设置访问的权限
      <servers>
                 <server>
                 <id>example-snapshots</id>
                     <username>kh</username>
                      <password>123456</password>
                </server>

               <server>
                      <id>example-releases</id>
                    <username>kh</username>
                      <password>123456</password>
                  </server>

3.6.4 创建项目工厂和设置权限


 1、创建两个工厂:release 和 policy 的

 2、配置权限



 3、创建角色并且分配权限

 4、创建用户

 5、创建发布的工厂


4 生命周期


1. clean
   pre-clean  执行一些需要在 clean 之前完成的工作
   clean  移除所有上一次构建生成的文件
   post-clean  执行一些需要在 clean 之后立刻完成的工作
2. compile
   validate
   generate-sources
   process-sources
   generate-resources
   process-resources     复制并处理资源文件,至目标目录,准备打包。compile     编译项目的源代码。process-classes
   generate-test-sources 
   process-test-sources 
   generate-test-resources
   process-test-resources     复制并处理资源文件,至目标测试目录。test-compile     编译测试源代码。process-test-classes
   test     使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。prepare-package
   package     接受编译好的代码,打包成可发布的格式,如 JAR。pre-integration-test
   integration-test
   post-integration-test
   verify
   install     将包安装至本地仓库,以让其它项目依赖。deploy     将最终的包复制到远程的仓库,以让其它开发人员与项目共享。3. site
   pre-site     执行一些需要在生成站点文档之前完成的工作
   site    生成项目的站点文档
   post-site     执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
   site-deploy     将生成的站点文档部署到特定的服务器上

5. 插件


插件是 maven 的核心,所有执行的操作都是基于插件来完成的,为了让一个插件中可以实现众多的类似功能,maven 为插件设定
了目标,一个插件中有可能有多个目标,其实生命周期中的重要的每个阶段都是由插件的一个具体目标来执行的。插件是有周期的,maven 规定了插件的步骤。做完了某个动作之后,下一个动作是什么,每一个动作是由相应的插件来执行的。apache 插件存放在 maven 本地仓库中的 org\apache\maven 目录下。

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>${start-class}</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>   

如上所示:如何快速上手插件?

  • 方法一:百度,这种方法只能了解插件的表面
  • 方法二:查看 api 文档,比如 apache 的插件:

               http://maven.apache.org/plugins/
               文档中说的很详细,插件的参数,参数的用例等等,对于文档不是很详细的可以看源码
    
  • 方法三:查看源码

老版本

新版本

在上面两个类中,maven 一执行 compile 就会执行 execute()方法。

每一个目标都是一个类:如下图可知这个插件有两个目标,分别为 compile 和 testCompile,在新版本中,参数都用 @Parameter
注解来说明了,老版本用的是注释

# 例 1 如果希望在打包的时候将所有源文件生成 jar 包

      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
               <version>2.1.2</version>
               <executions>
                   <execution>
                       <phase>package</phase>
                       <goals>
                           <goal>jar-no-fork</goal>
                       </goals>
                   </execution>
               </executions>
          </plugin>
      </plugins>
  phase:绑定的阶段
goal: 要运行的目标
具体的参数可以查看文档或者是源码 

正文完
 0