什么是maven
maven是基于项目对象模型,通过一小段描述信息来管理项目的构建、报告和文档的项目软件管理工具
搭建maven环境
- maven官网下载maven3.3
- 设置环境变量M2_HOME = D:\SoftWare\Maven\apache-maven-3.5.2(maven安装目录)
- 修改Path,增加 ;M2_HOME%\bin
maven目录结构
- bin,maven的命令目录
- boot,maven的类加载器
- conf,配置文件
- lib,maven的运行时类库
maven目录结构
注意,mvn的目录结构有着固定的模式:
- src
- main
-java
- 各种自定义目录package
- test
- java
- 各种自定义目录package
- resources资源目录
- pom.xml
maven的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/maven-v4_0_0.xsd">
<!--maven的版本,这是固定的-->
<modelVersion>4.0.0</modelVersion>
<!--groupId就是项目的包名-->
<groupId>cn.seu.edu.maven01</groupId>
<!--artifactId就是模块名-->
<artifactId>maven01-model</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--导入Junit依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
</dependencies>
</project>
注意pom文件应该与src属于同一级目录
mvn基本命令
注意,mvn命令后面不能带有“;”
1. mvn compile,表示编译项目
2. mvn test,运行test
3. mvn package,为项目生成jar
4. mvn clean,删除target文件
5. mvn install,安装本地jar到目录
6. mvn archetype:generate,自动创建符合maven要求的目录结构,也可以使用mvn archetype:generate -DgroupId=xxx(这里一般就是组织名,例如公司网址反写+项目名) -DartifactId=sss(这里一般是项目在公司的唯一标识,例如项目名-模块名) -Dversion=11111 指定版本号 -Dpackage=dddddd代码所在的包
maven的坐标与仓库
maven中任何依赖、插件、项目输出等够成为构件,构件通过坐标唯一标识;
镜像仓库,镜像仓库的修改在maven的conf目录下setting.xml中的mirros节点
<mirror>
<id>mirrorId</id>
《mirror of标识为那个仓库添加镜像,这里也可以使用 * 代表所有仓库,一旦使用了镜像仓库,所有对原仓库的访问都将转为对镜像仓库的访问》
<mirrorOf>repositoryId</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://my.repository.com/repo/path</url>
</mirror>
</mirrors>
更改仓库的位置
默认情况下,maven的仓库在C:\Users\Administrator.m2\repostory,一般不将仓库放在C盘,若需要修改位置,修改maven的conf中的settings.xml中
<localRepository>D:/SoftWare/ThirdPart4Java/Maven350/Responsitory</localRepository>
为了方便,这里最好将settings.xml文件也复制到该仓库中
eclipse中安装maven插件与创建maven项目
- 修改eclipse.ini文件,添加
-vm
D:\SoftWare\javaJDK\JDK8u91\bin\javaw.exe
- 修改eclipse的启动jre,在windows-preference-java-installedJres中add一个VM,定位带jdk的安装目录,这里内置了一个jre
这里如果不更改,使用package命令时会出现
No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
- 修改maven-user settings,定位到maven的settings.xml文件即可
maven项目声明周期
一个完成的项目周期包括:清理clean、编译compile、测试test、打包package、集成测试、验证test、部署deploy
maven的三套生命周期
- clean,清理项目
- pre-clean,执行清理前的工作
- clean,清理上一次够姜生成的所有文件
- post-clean, 执行清理后的文件
- default,构建项目
- compile
- test
- package
- install
- site,生成项目站点
- pre-site,生成站点前需要完成的工作
- site,生成项目的站点文档
- post-site,生成站点后需要完成的工作
- site-deploy,发不生成的站点到服务器
相关插件
maven的相关插件在这里http://maven.apache.org/plugins/index.html,以source插件为例,为项目生成源码包
1. 在pom文件中添加下述语句
<build>
<plugins>
<plugin>
<!--这里指定的source插件的坐标-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<!--这里指定的是执行的时机,即在运行package打包生成jar的同时生成源码包-->
<executions>
<execution>
<phase>package</phase>
<goals>
<!--这里是目标,每个插件都有自己的目标,source的goals见http://maven.apache.org/plugins/maven-source-plugin/-->
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
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>公司网址反写+项目名</groupId>
<!--maven的项目和实际项目并不对应,maven项目对应实际项目的一个模块,即一个实际项目会有多个maven项目-->
<artifactId>项目名-模块名</artifactId>
<!--0大版本号.0分支版本号.1小版本号-->
<!--
snapshot 快照版本
alpha 内部测试版
beta 公测版本
release 稳定版本
GA 正式发布版本
-->
<version>0.0.1-SNAPSHOT</version>
<!--项目打包方式,默认jar,也可以为war/zip/pom等-->
<packaging>jar</packaging>
<!--项目描述名,用于生成相关文档-->
<name>hi</name>
<!--项目地址-->
<url>http://maven.apache.org</url>
<!--项目描述-->
<description></description>
<!--项目开发者-->
<developers></developers>
<!--许可证信息-->
<license></license>
<!--组织信息-->
<organization></organization>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--依赖列表-->
<dependencies>
<!--每个dependency都表示一个依赖项-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<!--scope表示作用范围,Junit仅用于test
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
-->
<scope>test</scope>
<!--依赖项是否可选,默认false,即必须强制引入-->
<optional>true/false</optional>
<!--依赖排除列表,和dependecies类似,内含多个exclusion,注意exclusions在dependency标签内-->
<exclusions></exclusions>
</dependency>
</dependencies>
<!--dependencyManagement模块和dependencices类似,不同之处在于他并不会执行
一般在父模块中定义,用于子模块继承
-->
<dependencyManagement></dependencyManagement>
<build>
<!--插件列表-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!--用在子模块中,用于对父模块pom的继承-->
<parent></parent>
<!--聚合多个maven项目,将各模块合并-->
<modules></modules>
</project>
修改maven默认jdk版本
在settings.xml的profiles节点加入一个profile
<profile>
<id>jdk-1.7</id>
<activation>
<activeByDefaule>true</activeByDefaule>
<jdk>1.7</jdk>
</activation>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
</properties>
</profile>
maven 依赖冲突
例如A/B分别依赖两个不同版本的构建,这里就会存在冲突,maven采用如下的原则
1. 短路优先,
A -> B -> C -> X(jar);
A -> D -> X(jar);
这里,maven将采用第二个路径
- 路径相同,则先声明先依赖
maven聚合
<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.hongxing</groupId>
<artifactId>hongxing.aggreation</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>hongxing.aggreation</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<modules>
<module>../hongxing-bege</module>
<module>../hongxing-nange</module>
<module>../hongxing-shanji</module>
</modules>
</project>
maven继承
<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.hongxing</groupId>
<artifactId>hongxing-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!--这里package定义为pom-->
<packaging>pom</packaging>
<name>hongxing-parent</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--这里定义Junit的版本-->
<junit.version>3.8.1</junit.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--因为在property中定义了该属性,这里就可以向SpEL那样引用-->
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
maven搭建web项目
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cm.seu.edu.web</groupId>
<artifactId>web-demo</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>web-demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>web-demo</finalName>
<plugins>
<plugin>
<!--
这里是使用jetty作为web容器
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>8.1.16.v20140903</version>
-->
<!--这里使用的是tomcat-->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<!-- 打包后运行jetty插件 -->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>