IT@程序员猿媛

Maven 相关整理

2019-06-28  本文已影响1人  58bc06151329

文前说明

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写成博客与大家一起交流,也希望采用这种方式记录自己的学习之旅。

本文仅供学习交流使用,侵权必删。
不用于商业目的,转载请注明出处。

1. 概要

2. 原理

2.1 安装

[root@compiler3x noarch]# mvn -v
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
Apache Maven 3.5.3 (3383c37e1f9e9b3bc3df5050c29c8aff9f295297; 2018-02-25T03:49:05+08:00)
Maven home: /root/software/apache-maven-3.5.3
Java version: 1.7.0_181, vendor: Oracle Corporation
Java home: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.181-2.6.14.8.el7_5.x86_64/jre
Default locale: en_US, platform encoding: UTF8
OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"

2.2 仓库与坐标

.
├── pom.xml
└── src
    └── main
        ├── java
        └── resources
    └── test

仓库

<localRepository>/root/Java/repository</localRepository>

坐标

2.3 依赖

依赖范围

范围 说明
compile 编译范围,默认值,如果没有提供一个范围,那依赖的范围就是编译范围。编译范围依赖在所有的 classpath 中可用,适用于所有阶段(开发、测试、部署、运行),jar 包会一直存在于所有阶段。
provided 已提供范围,依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用。已提供范围的依赖在编译 classpath (不是运行时)可用。它们不是传递性的,也不会被打包。只在开发、测试阶段使用,目的在于不让 Servlet 容器和本地仓库的 jar 包冲突 。例如 servlet.jar。
runtime 运行时范围,依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如在编译的时候只需要 JDBC api jar,而只有在运行的时候才需要 JDBC 驱动实现。
test 测试范围,在一般的编译和运行时都不需要,只有在测试编译和测试运行阶段可用。不会随项目发布。
system 系统范围,类似 provided,必须显式的提供一个对于本地系统中 jar 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。maven 不会在 Repository 中查找它。如果将一个依赖范围设置成系统范围,必须同时提供一个 systemPath 元素。

依赖的传递性

依赖的传递性

依赖版本的原则

路径最短者优先原则 路径相同先声明优先原则

统一管理依赖的版本

2.4 生命周期

Clean Lifecycle

阶段 说明 插件的目标
pre-clean 执行一些需要在 clean 之前完成的工作。
clean 移除所有上一次构建生成的文件。 maven-clean-plugin:clean
post-clean 执行一些需要在 clean 之后立刻完成的工作。
<phases>
  <phase>pre-clean</phase>
  <phase>clean</phase>
  <phase>post-clean</phase>
</phases>
<default-phases>
  <clean>
    org.apache.maven.plugins:maven-clean-plugin:2.5:clean
  </clean>
</default-phases>

Default Lifecycle

阶段 说明 插件的目标
validate 验证,验证项目是否正确,并且所有必要的信息是否有效。
initialize 初始化,初始化生成状态,例如设置属性或创建目录。
generate-sources 生成源,生成任何要包含在编译中的源代码。
process-sources 处理源代码,处理源代码,例如过滤任何值。
generate-resources 生成资源,生成要包含在包中的资源。
process-resources 复制并处理资源文件,至目标目录,准备打包。 maven-resources-plugin:resources
compile 编译项目的源代码。 maven-compiler-plugin:compile
process-classes 进程类,从编译后处理生成的文件,例如在 Java 类上做字节码增强。
generate-test-sources 生成测试源,生成任何要包含在编译中的测试源代码。
process-test-sources 处理测试源,处理测试源代码,例如过滤任何值。
generate-test-resources 生成测试资源,为测试创建资源。
process-test-resources 复制并处理资源文件,至目标测试目录。 maven-resources-plugin:testResources
test-compile 编译测试源代码。 maven-compiler-plugin:testCompile
process-test-classes 过程测试类,在测试编译后处理生成的文件,例如在 Java 类上做字节码增强。适用于 Maven 2.0.5 及以上。
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。 maven-surefire-plugin:test
prepare-package 准备包装,在实际包装之前,执行准备包装所需的任何操作。这通常会导致包的解包、处理版本。适用于 Maven 2.1 及以上。
package 接受编译好的代码,打包成可发布的格式,如 jar。 maven-jar-plugin:jar
pre-integration-test 预集成测试,在执行集成测试之前执行所需的操作。这可能涉及到诸如设置所需环境之类的事情。
integration-test 集成测试,在可以运行集成测试的环境中处理和部署包(如果需要)。
post-integration-test 集成后测试,执行集成测试后执行所需的操作。这可能包括清理环境。
verify 运行集成测试,以确保项目符合质量标准。
install 将包安装至本地仓库,用于让其它项目依赖。 maven-install-plugin:install
deploy 将最终的包复制到远程的仓库,用以让其他开发人员与项目共享。 maven-deploy-plugin:deploy
<phases>
  <phase>validate</phase>
  <phase>initialize</phase>
  <phase>generate-sources</phase>
  <phase>process-sources</phase>
  <phase>generate-resources</phase>
  <phase>process-resources</phase>
  <phase>compile</phase>
  <phase>process-classes</phase>
  <phase>generate-test-sources</phase>
  <phase>process-test-sources</phase>
  <phase>generate-test-resources</phase>
  <phase>process-test-resources</phase>
  <phase>test-compile</phase>
  <phase>process-test-classes</phase>
  <phase>test</phase>
  <phase>prepare-package</phase>
  <phase>package</phase>
  <phase>pre-integration-test</phase>
  <phase>integration-test</phase>
  <phase>post-integration-test</phase>
  <phase>verify</phase>
  <phase>install</phase>
  <phase>deploy</phase>
</phases>

Site Lifecycle

阶段 说明 插件的目标
pre-site 执行一些需要在生成站点文档之前完成的工作。
site 生成项目的站点文档。 maven-site-plugin:site
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备。
site-deploy 将生成的站点文档部署到特定的服务器上。 maven-site-plugin:deploy
<phases>
  <phase>pre-site</phase>
  <phase>site</phase>
  <phase>post-site</phase>
  <phase>site-deploy</phase>
</phases>
<default-phases>
  <site>
    org.apache.maven.plugins:maven-site-plugin:3.3:site
  </site>
  <site-deploy>
    org.apache.maven.plugins:maven-site-plugin:3.3:deploy
  </site-deploy>
</default-phases>

2.5 构建

生命周期与插件的绑定关系

2.5.1 Packaging 的内置生命周期绑定目标

ejb / ejb3 / jar / par / rar / war

阶段 插件的目标
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package ejb:ejb / ejb3:ejb3 / jar:jar / par:par / rar:rar / war:war
install install:install
deploy deploy:deploy
<phases>
  <process-resources>
    org.apache.maven.plugins:maven-resources-plugin:2.6:resources
  </process-resources>
  <compile>
    org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
  </compile>
  <process-test-resources>
    org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
  </process-test-resources>
  <test-compile>
    org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
  </test-compile>
  <test>
    org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
  </test>
  <package>
    org.apache.maven.plugins:maven-jar-plugin:2.4:jar
  </package>
  <install>
    org.apache.maven.plugins:maven-install-plugin:2.4:install
  </install>
  <deploy>
    org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
  </deploy>
</phases>

pom(纯元项目的打包方式)

阶段 插件的目标
package site:attath-descriptor
install install:install
deploy deploy:deploy
<phases>
  <install>
    org.apache.maven.plugins:maven-install-plugin:2.4:install
  </install>
  <deploy>
    org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
  </deploy>
</phases>

ear

阶段 插件的目标
generate-resources ear:generate-application-xml
process-resources resources:resources
package ear:ear
install install:install
deploy deploy:deploy
<phases>
  <generate-resources>
    org.apache.maven.plugins:maven-ear-plugin:2.8:generate-application-xml
  </generate-resources>
  <process-resources>
    org.apache.maven.plugins:maven-resources-plugin:2.6:resources
  </process-resources>
  <package>
    org.apache.maven.plugins:maven-ear-plugin:2.8:ear
  </package>
  <install>
    org.apache.maven.plugins:maven-install-plugin:2.4:install
  </install>
  <deploy>
    org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
  </deploy>
</phases>

maven-plugin

阶段 插件的目标
generate-resources plugin:descriptor
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package jar:jar and plugin:addPluginArtifactMetadata
install install:install
deploy deploy:deploy
<phases>
  <process-resources>
    org.apache.maven.plugins:maven-resources-plugin:2.6:resources
  </process-resources>
  <compile>
    org.apache.maven.plugins:maven-compiler-plugin:3.1:compile
  </compile>
  <process-classes>
    org.apache.maven.plugins:maven-plugin-plugin:3.2:descriptor
  </process-classes>
  <process-test-resources>
    org.apache.maven.plugins:maven-resources-plugin:2.6:testResources
  </process-test-resources>
  <test-compile>
    org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
  </test-compile>
  <test>
    org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test
  </test>
  <package>
    org.apache.maven.plugins:maven-jar-plugin:2.4:jar,
    org.apache.maven.plugins:maven-plugin-plugin:3.2:addPluginArtifactMetadata
  </package>
  <install>
    org.apache.maven.plugins:maven-install-plugin:2.4:install
  </install>
  <deploy>
    org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy
  </deploy>
</phases>

2.6 Plugin

...
 <plugin>
   <groupId>org.codehaus.modello</groupId>
   <artifactId>modello-maven-plugin</artifactId>
   <version>1.8.1</version>
   <executions>
     <execution>
       <configuration>
         <models>
           <model>src/main/mdo/maven.mdo</model>
         </models>
         <version>4.0.0</version>
       </configuration>
       <goals>
         <goal>java</goal>
       </goals>
     </execution>
   </executions>
 </plugin>
...

2.6.1 插件配置

命令行插件配置

[root@localhost ~]# mvn install -Dmaven.test.skip=true

pom 中插件全局配置

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <source>1.5</source>
                <target>1.5</target>
            </configuration>
        </plugin>
    </plugins>
</build>

pom 中插件任务配置

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-antrun-plugin</artifactId>
            <version>1.3</version>
            <executions>
                <execution>
                    <id>ant-validate</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <tasks>
                            <echo>I'm bound to validate phase.</echo>
                        </tasks>
                    </configuration>
                </execution>
                <execution>
                    <id>ant-verify</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                    <configuration>
                        <tasks>
                            <echo>I'm bound to verify phase.</echo>
                        </tasks>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2.6.2 常用插件

编译插件

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-compiler-plugin</artifactId>  
    <configuration>  
        <source>1.6</source>  
        <target>1.6</target>  
        <encoding>${project.build.sourceEncoding}</encoding>  
    </configuration>  
</plugin>  
参数 说明
source 源代码编译版本。
target 目标平台编译版本。
encoding 字符集编码。

设置资源文件的编码方式

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-resources-plugin</artifactId>  
    <version>2.4.3</version>  
    <executions>  
        <execution>  
            <phase>compile</phase>  
        </execution>  
    </executions>  
    <configuration>  
        <encoding>${project.build.sourceEncoding}</encoding>  
    </configuration>  
</plugin> 
参数 说明
phase 绑定到 compile 阶段。
encoding 设置编码方式。

自动拷贝 jar 包到 target 目录

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-dependency-plugin</artifactId>  
    <version>2.6</version>  
    <executions>  
        <execution>  
            <id>copy-dependencies</id>  
            <phase>compile</phase>  
            <goals>  
                <goal>copy-dependencies</goal>  
            </goals>  
            <configuration>  
                <!-- ${project.build.directory}为 maven 内置变量,缺省为 target -->  
                <outputDirectory>${project.build.directory}/lib</outputDirectory>  
                <excludeTransitive>false</excludeTransitive>  
                <stripVersion>true</stripVersion>  
            </configuration>  
        </execution>  
    </executions>  
</plugin>  
参数 说明
outputDirectory target 目录。
excludeTransitive 表示是否不包含间接依赖的包。
stripVersion 表示复制的 jar 文件去掉版本信息。

生成源代码 jar 包

<plugin>  
    <artifactId>maven-source-plugin</artifactId>  
    <version>2.1</version>  
    <configuration>  
        <!-- <finalName>${project.build.name}</finalName> -->  
        <attach>true</attach>  
        <encoding>${project.build.sourceEncoding}</encoding>  
    </configuration>  
    <executions>  
        <execution>  
            <phase>compile</phase>  
            <goals>  
                <goal>jar</goal>  
            </goals>  
        </execution>  
    </executions>  
</plugin>  
参数 说明
phase 绑定到 compile 阶段。
attach 指定是否将项目附加到项目。
encoding 设置编码方式。

将项目打成 jar 包

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-jar-plugin</artifactId>  
    <version>2.4</version>  
    <configuration>  
        <archive>  
            <manifest>  
                <addClasspath>true</addClasspath>  
                <classpathPrefix>lib/</classpathPrefix>  
                <!-- 当用户使用 lib命令执行JAR文件时,使用该元素定义将要执行的类名 -->  
                <mainClass>com.demo.test.Test</mainClass>  
            </manifest>  
        </archive>  
    </configuration>  
</plugin> 
参数 说明
addClasspath 告知 maven-jar-plugin 添加一个 Class-Path 元素到 MANIFEST.MF 文件,以及在 Class-Path 元素中包括所有依赖项 。
classpathPrefix 所有的依赖项应该位于 lib 文件夹。
mainClass 当用户使用 lib 命令执行 jar 文件时,使用该元素定义将要执行的类名。

将项目打成 war 包

<plugin>  
    <groupId>org.apache.maven.plugins</groupId>  
    <artifactId>maven-war-plugin</artifactId>  
    <version>2.1.1</version>  
    <configuration>  
        <!-- <warName>${project.build.name}</warName> -->  
    </configuration>  
</plugin> 
参数 说明
encoding 强制字符集编码。
warName war 包名称。
webappDirectory 产生 war 前,用于存放构建 war 包的目录。

打包时清空一些指定目录

<plugin>  
    <artifactId>maven-clean-plugin</artifactId>  
    <configuration>  
        <verbose>true</verbose>  
        <filesets>  
            <fileset>  
                <directory>c:/test</directory>  
            </fileset>  
      </filesets>  
    </configuration>  
</plugin>  

插件检查不通过,人为忽略

<pluginManagement>  
    <plugins>  
        <plugin>  
            <groupId>org.eclipse.m2e</groupId>  
            <artifactId>lifecycle-mapping</artifactId>  
            <version>1.0.0</version>  
            <configuration>  
                <lifecycleMappingMetadata>  
                    <pluginExecutions>  
                        <!-- 忽略 2.0 以上版本的 maven-dependency-plugin 的检查 -->  
                        <pluginExecution>  
                            <pluginExecutionFilter>  
                                <groupId>org.apache.maven.plugins</groupId>  
                                <artifactId>maven-dependency-plugin</artifactId>  
                                <versionRange>[2.0,)</versionRange>  
                                <goals>  
                                    <goal>copy-dependencies</goal>  
                                </goals>  
                            </pluginExecutionFilter>  
                            <action>  
                                <ignore />  
                            </action>  
                        </pluginExecution>  
                    </pluginExecutions>  
                </lifecycleMappingMetadata>  
            </configuration>  
        </plugin>  
    </plugins>  
</pluginManagement>  

参考资料

https://www.cnblogs.com/yjf512/p/7449728.html
https://blog.csdn.net/zhaojianting/article/details/80321488

上一篇下一篇

猜你喜欢

热点阅读