方便第三方框架管理和便捷的项目构建过程
Maven项目目录
- src
- ----main
- --------java
- ------------package 主代码
- ----test
- --------package 测试代码
- ----resouce
- pom.xml
常用命令
-v 查看版本
-compile 编译
-package 打包
-clean 清楚target
-install 安装jar到本地仓库
自动创建目录
archetype插件:创建符合maven规定的目录的骨架
- 进入文件夹打开命令行
- 执行 mvn archetype:generate,输入 groupId、artifactId、version,按照提示进行选择
- 或者 mvn archetype:generate DgroupId=组织名,公司网址反写+项目名 DartifactId=项目名-模块名 -Dversion=版本号 -Dpackage=代码所存在的包 ,一次性设置完所有属性
坐标和仓库
坐标:项目的地址,如:groupId、artifactId、version
仓库:本地仓库、远程仓库,当本地仓库找不到需要的构件时,从远程仓库查找后再下载
默认全球仓库地址:apache-maven/bin/maven-model-builder.jar/org/apache/maven/model/pom.xml(超级pom,所有pom都继承它)
镜像仓库:A提供和B一样的功能,国内更稳定。修改为国内仓库,打开apache-maven/conf/settings.xml,找到mirror标签模板,复制出来修改为:
<mirror>
<id>maven.net.cn</id>
<mirrorOf>central</mirrorOf>
<name>central mirror in china</name>
<url>http://maven.net.cn/content/groups/public</url>
</mirror>
一旦指定镜像仓库,远程仓库将转到镜像仓库,原仓库不能直接访问
更改仓库位置:默认在用户目录中:用户名/.m2/repository。在settings.xml中localRepository标签,修改它为自定义位置。
IDE创建Maven项目
maven的jre应该与idejre都指定为jdk中jre,更改使用本地maven
Maven的生命周期和插件
完整的项目构建过程包括:清理、编译、测试、打包、集成测试、验证、部署
一、生命周期:maven创建了3套独立生命周期:1、clean 清理项目,2、default 构建项目,3、site 生成项目站点
1、clean 清理项目:
pre-clean 执行清理前工作
clean 清理上一次构建生成的所有文件
post-clean 执行清理后的文件
2、default 构建项目(核心):
compile test package install
执行后一个命令会自动执行前一个
3、site 生成项目站点:
pre-site 生成项目前要执行的操作
site 生成项目的站点文档
post-site 生成项目后要执行的操作
site-deploy 发布生成站点到服务器上
二、插件:maven官网有很多插件,网址:https://repo.maven.apache.org/maven2/
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.8.2</version>
<executions>
<execution>
<phase>package</phase>
<source>jar-no-fork</source>
</executios>
</executions>
</plugin>
</plugins>
</bulid>
POM元素介绍
核心管理文件,用于项目描述、组织管理、依赖管理、构建信息管理
project:根元素
modelVersion:指定了pom版本
坐标信息:groupId:公司网址反写+项目名、artifackId:模块标识:项目名+模块名、version:版本号(1:大版本号,2、分支版本,3、小版本,snapshot快照、beta测试、Release稳定、GA正式版本)、packaging:打包方式,默认jar,可选war,zip,pom
name:项目描述名
url:项目地址
properties:变量
description:项目描述
licenses:许可证
organization:组织信息
依赖列表:dependencies>dependency:groupId、artifactId、version、type、scope依赖范围:test、optional:bealoon是否可选、exclusions>exclusion:排除排除以来列表(引入a包含cb,排除c)
依赖管理:dependencyManagement不会被引入实际,用于继承
build>plugins:插件列表
parent:子模块继承父模块
modules>module:指定多个模块一起编译
scope依赖范围
compile:默认范围,编译测试运行都有效
provided:测试和编译时有效,如:测试时加入servlet依赖,运行时若加入导致冲突
runtime:测试和运行时有效,如jdbc驱动时,只有在测试和运行时采用jdbc驱动
test:测试有效,junit
system:编译和测试有效,与本机系统相关,移植性差
import:导入依赖范围,只使用在dependencyManagement中,表示从其他pom中导入dependecy的配置,继承依赖
依赖传递
如有A、B、C三个项目,需要B引用A依赖,把A项目打包并安装到仓库,B中添加依赖。B再打包安装到仓库,把B的坐标添加到C中。
依赖具有传递性,若想C中想排除A则用exclusions>exclusion>坐标A。
Maven依赖JDK版本配置
在setting.xml中的profile中添加:
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
依赖冲突
如有A和B依赖不同版本的构件,那么依赖对于ABC来说究竟依赖的是哪个版本构件
1、短路优先
A->B->C->X(jar)
A->D->X(jar)
优先使用路径短的版本
2、路径相同,先声明优先
聚合和继承
聚合:若想把多个项目安装到本地仓库中必须对其依次执行install,用聚合可以把多个一起执行。
创建1个新项目,pom文件中packaging值设置为pom,再加入modules>module标签>相对路径+项目文件名。
继承:若有多个项目引用相同依赖,可以创建一个parent项目,可以把test目录删除,在pom中修改packaging为pom,添加
<properties>
<变量名>值</变量名>
</properties>
<dependencyManagement>
<!--添加共用依赖,放dependencyManagement中不会执行-->
<dependecies>
<dependecy>
<groupId></groupId>
<artifactId></artifactId>
<version>${变量名}</version>
</dependecy>
</dependecies>
</dependencyManagement>
在引用的项目pom中使用parent标签,引入parent项目的坐标。
创建Web项目
使用webapp模板,目录为:
- src
- ----main
- --------java
- --------resouce
- --------webapp
- ------------WEB-INF
- ----------------index.jsp
- ----test
- --------java
- --------resouce
- pom.xml
在pom中添加servlet依赖:
<dependecies>
<dependecy>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<!--只在编译和测试中依赖-->
<scope>provided</scope>
</dependecy>
</dependecies>
再确保输出output目录为target/classes中,再配置项目的test,使它在部署时不部署,最后用package打包成war包。
使用jetty运行应用
需要在build>plugins>plugin>jetty坐标,使用命令jetty:run,可添加:
<executions>
<execution>
<!--当打包成功后使用jetty:run运行jetty服务-->
<phase>package</phase>
<source>run</source>
</executios>
</executions>
之后可用clean package命令打包,打包后自动运行服务器。
使用tomcat运行应用
进入tomcat官网打开Maven Plugin,选择版本,选择坐标,pom引入tomcat插件坐标,在build>plugins>plugin>tomcat坐标