初识maven
个人对maven使用的总结:
https://blog.csdn.net/ya_1249463314/article/details/61416711
关键概念之坐标和依赖
什么是坐标
在我们的工程中引用的jar包和war包等文件,我们需要通过坐标来对这些构件来进行唯一标识。所以坐标的作用就是为构件进行唯一标识。
坐标详解
groupId:就是定义当前的maven项目属于哪个公司的哪个项目,groupId的表示方式与java包名的表示方式类似,通常域名反向一一对应。
artifactId:就是项目中指定的模块。推荐做法是使用实际项目名称作为artifactId作为前缀。
version:就是maven项目中当前构件的版本号、
packaging:就是当前maven项目打包方式。如果写成jar,那么就打包成jar包。如果写war,就打包成war包。如果不定义packaging,那么默认值就打成jar。
classifier:就是帮助输出一些附属的构件。譬如文档doc,源码source等文件。但是要注意这个属性是不能直接定义的,附属构件是插件帮助生成的。
依赖的配置
依赖的前提是坐标,只有坐标定位,才能找到maven对应的依赖。
依赖的配置:
groupId artifactId version:依赖基本坐标
type:依赖的类型,对应于项目坐标定义的packaging。默认情况下声明为jar。
scope:依赖的范围。(compile:编译期依赖范围;test:测试依赖范围;provided:已提供范围,就是对于编译和测试classpath有效,运行时期无效;runtime:运行时依赖范围。对于测试和运行classpath时有效,但是编译主代码时无效;system:系统依赖范围)。
optional:可选依赖。我们知道依赖有传递性,A依赖于B,B依赖于C并且B依赖于D,如果B中设置optional属性为true,那么A将不会依赖于C和D。C和D只会对B产生影响。
exclusions:用来排除指定的依赖。由于依赖的传递性,就会给项目隐式的引入很多依赖,但是往往会带来一些冲突等问题。我们可以使用exclusions来排除多个冲突的依赖。
关键概念之仓库
什么是仓库
仓库就是用来存放构件的地方。
仓库的分类
本地仓库:每个用户都会在自己的windows、linux上拥有一个仓库目录。用来存放jar包。在settings.xml中配置。
中央仓库:面向全球的。远程仓库下载地址:http://repo1.maven.org/maven2
公司私服仓库:是一种远程仓库,部署在局域网中,方便整个团队的开发使用。
关键概念之生命周期
Maven的三套独立的生命周期
① clean生命周期:清理项目。
② default生命周期:构建项目。
③ site生命周期:建立项目站点。
clean生命周期:
pre-clean执行清理前的准备工作
clean清理上一次构建生成的文件
post-clean执行一些清理后需要的工作
default生命周期:
validate
initialize
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或war。
pre-integration-test
intergration-test
post-integration-test
verify
install将maven包安装到本地maven库,让本地的其他的项目来使用此包。
deploy将最终的包部署到远程仓库。让其他程序员和maven项目使用。
site生命周期:
site生命周期就是建立和发布项目站点。
pre-site执行一些项目站点之前需要完成的工作。
site生成项目的文档。
post-site执行一些生成项目站点之后的工作。
site-deploy将项目站点发布到服务器。
关键常用命令
mvn clean命令就是执行clean生命周期中的clean阶段(清理上一次构建的文件)。
mvn test命令就是执行default生命周期中的test阶段(使用单元测试框架运行测试)。
mvn clean install命令就是执行了clean生命周期中的clean阶段和default生命周期中的install阶段(清理上一次构建的文件并且将maven包安装到本地maven库中)。
mvn clean deploy site-deploy命令就是执行了clean生命周期的clean阶段、default生命周期的deploy阶段、site生命周期的site-deploy阶段(清理上一次构建的文件、将maven包安装到本地maven库中、将项目站点发布到服务器)。
补充:
mvn compile命令执行default生命周期中的compile阶段(编译项目中的主源码)。
mvn package命令执行default生命周期中的package阶段(将代码打包成指定的格式)。
关键概念之聚合
什么是聚合
聚合就是为了满足我们一次想构建多个项目,而不是去每个项目专门的构建一遍。达到快速构建项目的目得。
聚合如何实现
采用pom打包多个module元素来实现多个项目模块的聚合。
例子:
maven-parent的pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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>cn.spy</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>maven-parent</name>
<modules>
<module>../maven-first</module>
<module>../maven-second</module>
<module>../maven-third</module>
</modules>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
执行maven install命令
解释:
maven会首先解析聚合模块的pom文件。分析要构建的模块并且计算反应堆构建顺序。然后按照这个顺序构建各个模块。
关键概念之继承
什么是继承
项目模块与项目模块之间会存在调用重复jar包的情况。为了消除这个情况,使用继承来消除重复配置。
继承的实现
例子:
maven-parent的pom配置:
<?xml version="1.0" encoding="UTF-8"?>
<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>cn.spy</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>maven-parent</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
</dependencies>
</project>
注意:我在maven-parent中加入了fastjson的jar包依赖配置。当maven-first项目模块继承maven-parent项目模块就会发现maven-first项目会自动依赖了fastjson的jar包了。
maven-first项目模块的pom文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<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>
<parent>
<groupId>cn.spy</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../maven-parent/pom.xml</relativePath>
</parent>
<groupId>cn.spy</groupId>
<artifactId>maven-first</artifactId>
<version>1.0.1-SNAPSHOT</version>
<name>maven-first</name>
</project>
解释:可以发现maven-first也引入了fastjson的jar包
注意:
① 父类maven-parent项目模块的packaging打包类型必须为pom。
② relativePath表示父模块相对路径。当项目构建时,会根据relativePath去检查父类的pom。如果没找到,就从本地仓库中找。
③ maven默认父pom在上一层目录。
关键概念之依赖管理
继承的引发的问题
如果子项目模块继承了父项目模块的pom,那么就会自动依赖父项目模块的jar包了。如果子项目模块想要根据实际需要引入父项目模块的jar包,那么就需要dependencyManagement元素。这样就可以增加继承的灵活性。
dependencyManagement元素的使用
maven-parent的pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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>cn.spy</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>maven-parent</name>
<properties>
<fastjson.version>1.2.31</fastjson.version>
<junit.version>4.11</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
maven-second项目模块的pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<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>
<parent>
<groupId>cn.spy</groupId>
<artifactId>maven-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../maven-parent/pom.xml</relativePath>
</parent>
<artifactId>maven-second</artifactId>
<name>maven-second</name>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
由于我们是maven中引用jar包的继承,所以我们的<packaging>标签为pom。如果我们是引用的jar包提供的接口实现,那么我们就将<packaging>标签为jar。
解释:
可以发现虽然maven-second项目模块继承maven-parent但是只对junit的jar包进行了引用,对于不需要的fastjson的jar包并没有引用。
常用元素总结:
description:项目的描述信息。
inceptionYear:项目的创始年份。
distributionManagement:项目的部署配置。
properties:自定义的maven属性。
repositories:项目的仓库配置。
build:项目的源码目录配置、输出目录配置、插件配置、插件管理配置等。
reporting:项目的报告输出目录配置、报告插件配置等。
maven打包引入本地的jar包
<dependency>
<groupId>com.yizhilu</groupId>
<artifactId>qq-Sdk4J</artifactId>
<version>2.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/qq-Sdk4J-2.0.jar</systemPath>
</dependency>
解释:
${project.basedir} :代表当前项目的路径
maven生成jar包
配置pom文件
<build>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack</id>
<phase>package</phase>
<goals>
<goal>unpack</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<outputDirectory>${project.build.directory}/dubbo</outputDirectory>
<includes>META-INF/assembly/**</includes>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptor>src/main/assembly/assembly.xml</descriptor>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
生成eclipse项目文件
SET MAVEN_OPTS= -Xms512M -Xmx512M -XX:PermSize=128M -XX:MaxPermSize=128M -XX:ReservedCodeCacheSize=64M
mvn eclipse:clean eclipse:eclipse -Dwtpversion=2.0
发布项目到本地仓库
SET MAVEN_OPTS= -Xms512M -Xmx512M -XX:PermSize=128M -XX:MaxPermSize=128M -XX:ReservedCodeCacheSize=64M
mvn clean install -Dmaven.test.skip=true