文章目录
1. Maven简介
Maven是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
Maven的作用:
- 可以使用maven创建项目
- 管理项目生命周期
- 引入依赖(jar包)
- 分模块构建项目
Maven仓库:
- 本地仓库:相当于缓存;Maven所需要的任何构件都是直接从本地仓库获取的,如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件
- 中央仓库:由Maven社区提供的仓库,其中包含了大量常用的库。如:阿里云的maven中央仓库:https://maven.aliyun.com/mvn/guide
- 远程仓库:开发人员自己定制的仓库,包含了所需要的代码库或者其他工程中用到的jar文件;
Maven坐标:Maven的一个核心的作用就是管理项目的依赖,引入需要的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是Maven坐标。包括自己开发的项目,也是要通过坐标进行唯一标识,这样才能在其它项目中进行依赖引用。坐标的定义元素如下:
- groupId:项目组织唯一的标识符,实际对应Java包的结构
- artifactId:项目的名称
- version:项目的当前版本
2. Maven安装
2.1 Windows版本安装
-
官网下载Maven:http://maven.apache.org/download.cgi
- Linux系统下载Link下的Binary tar.gz archive,如:apache-maven-3.6.3-bin.tar.gz
- Windows系统下载Link下的Binary zip archive,如:apache-maven-3.6.3-bin.zip
-
将压缩包解压
-
添加环境变量
- MAVEN_HOME配置到bin的上一级,如:MAVEN_HOME=E:\Develop\Maven\apache-maven-3.6.3
- path配置到bin目录:%MAVEN_HOME%\bin
-
在MAVEN_HOME\conf\settings.xml文件中的settings标签里配置本地仓库:
<localRepository>E:\Develop\Maven\repository</localRepository>
-
在MAVEN_HOME\conf\settings.xml文件中的mirrors标签里配置阿里云maven中央仓库:
<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
-
在MAVEN_HOME\conf\settings.xml文件中的profiles标签里配置默认jdk版本和spring代理仓库:
<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> <encoding>UTF-8</encoding> </properties> <repositories> <!--在repositories标签中可加入其它代理仓库使用地址。以使用spring代理仓为例:--> <repository> <id>spring</id> <url>https://maven.aliyun.com/repository/spring</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>true</enabled> </snapshots> </repository> </repositories> </profile>
-
测试Maven是否安装成功:在cmd中输入mvn -version
C:\Users\15508>mvn -version Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: E:\Develop\Maven\apache-maven-3.6.3\bin\.. Java version: 1.8.0_261, vendor: Oracle Corporation, runtime: E:\Develop\Java\jdk1.8.0_261\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows" C:\Users\15508>
Maven目录简介:
- bin:Maven命令
- boot:第三方类加载框架
- conf:配置文件
- lib:Maven自身jar包
2.2 Linux版本安装
-
官网下载Maven:http://maven.apache.org/download.cgi
-
安装Maven:
tar xf apache-maven-3.6.3-bin.tar.gz mv apache-maven-3.6.3 /usr/local/ ln -s /usr/local/apache-maven-3.6.3/ /usr/local/maven
-
添加环境变量:
在/etc/profile中追加 export PATH=/usr/local/maven/bin/:$PATH 然后重新加载/etc/profile:source /etc/profile
-
设置阿里云maven中央仓库:
vim /usr/local/maven/conf/settings.xml 158行下面添加 <mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror>
3. IDEA集成Maven*
- 在初始创建项目的界面点击Configure–>Settings
- 点击:Build, Execution, Deployment–>Build Tools–>Maven
- Maven home directory为Maven的安装路径:E:\Develop\Maven\apache-maven-3.6.3
- User settings file为settings.xml文件路径:E:\Develop\Maven\apache-maven-3.6.3\conf\settings.xml
- Local repository为本地仓库路径:E:\Develop\Maven\repository
- 点击:Build, Execution, Deployment–>Build Tools–>Maven–>Runner
- VM Options设置为(创建项目时找本地仓库中的插件来创建项目):-DarchetypeCatalog=internal
- 创建新的Project,第一次使用maven创建时,一定要联网
3. 使用IDEA创建Maven项目
3.1 使用Maven骨架创建JavaSE模块
-
新建Maven模块–>勾选Create from archetype–>点击org.apache.maven.archetypes:maven-archetype-quickstart–>Next
-
设置Name、Location、groupId、artifactId、version
-
pom.xml文件说明:
<!-- properties:项目的一些属性 project.build.sourceEncoding:项目构建时的字符集 maven.compiler.source:编译源码的jdk版本 maven.compiler.target:编译目标的jdk版本 --> <!-- dependencies:项目引入的所有依赖 dependency:每一个依赖的信息 scope:依赖的使用范围,test表示只能在test里使用 -->
-
项目结构:
. ├── pom.xml Maven的配置文件(配置、依赖、...) └── src ├── main │ ├── java 存放java源码 │ └── resources 存放配置文件 └── test └── java 存放单元测试用例
3.2 不使用Maven骨架创建JavaSE模块
- 新建Maven模块–>Next
- 设置Name、Location、groupId、artifactId、version
-
pom.xml文件中只有本项目的坐标,配置需要自己写
<?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>com.liu2m</groupId> <artifactId>maven01</artifactId> <version>1.0-SNAPSHOT</version> <!--该项目的打包方式--> <packaging>jar</packaging> </project>
3.3 使用Maven骨架创建JavaWeb模块
-
新建Maven模块–>勾选Create from archetype–>点击org.apache.maven.archetypes:maven-archetype-webapp–>Next
-
设置Name、Location、groupId、artifactId、version
-
在pom.xml文件的dependencies标签里引入Servlet的依赖:
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency>
-
配置Tomcat,部署该模块
-
项目结构:
. ├── pom.xml └── src ├── main │ ├── java │ ├── resources │ └── webapp │ ├── index.jsp │ └── WEB-INF │ └── web.xml └── test └── java
3.4 不使用Maven骨架创建JavaWeb模块
-
新建Maven模块–>Next
-
设置Name、Location、groupId、artifactId、version
-
在pom.xml文件中配置打包方式为war
<packaging>war</packaging>
-
在pom.xml文件的dependencies标签里引入Servlet的依赖:
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> </dependencies>
-
在Project Structure项目的Web下的Deployment Descriptors中添加WEB-INF\web.xml:路径前缀为Web Resource Directories中的路径
4. Maven常用命令
- mvn clean:删除编译产生的target文件夹
- mvn compile:编译src/main/java目录的下的代码
- mvn test:先将main、test中的内容进行编译,然后执行src/test/java/下所有junit的测试用例
- mvn package:打包项目
- mvn install:将项目打包后安装到本地仓库
-
安装第三方jar包到本地仓库:
cmd切换到jar包所在目录,然后执行: mvn install:install-file -DgroupId=项目组织标识符 -DartifactId=项目名称 -Dversion=项目当前版本 -Dfile=jar文件名 -Dpackaging=jar
5. 引入依赖
在pom.xml文件的dependencies标签里使用dependency标签引入依赖
scope | 编译 | 测试 | 运行 |
---|---|---|---|
compile | √ | √ | √ |
provided | √ | √ | |
runtime | √ | √ | |
test | √ | ||
system | √ | √ |
scope默认为compile
解决Maven中依赖版本冲突:相同的jar包,但版本不一致
-
路径近者优先:直接依赖比传递依赖路径近,最终进入项目的jar包会是路径近的直接依赖包
- 直接依赖:项目中直接导入的jar包
- 传递依赖:项目中没有直接导入的jar包,可以通过中直接依赖包传递到项目中
-
路径相同时,pom文件中声明顺序优先
-
无法通过依赖管理原则排除的,使用直接排除法
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>4.2.4.RELEASE</version> <!--exclusions排除依赖传递的jar包--> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency>
6. 工程分层*
开发时可以分模块开发,运行整个工程时需要将各个模块聚合在一起
parent父工程:存放项目的所有jar包
web、service、dao子工程可以选择性的继承jar包并在自己的工程中使用,这样可以消除jar包重复并锁定版本,安装parent就可以将所有子工程全部安装
web依赖于service,service依赖于dao,访问时可以直接启动parent或安装后启动web
给工程分层:
-
创建一个Maven项目作为父工程,打包方式为pom
<!--父工程的pom.xml--> <modules> <!--每一个module标签的名称要和子工程的artifactId一致--> <module>model</module> </modules> <!--dependencyManagement只是管理依赖,而非导入依赖--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
-
在父工程下创建各个子工程
<!--子工程的pom.xml--> <!--parent为父工程的坐标--> <parent> <artifactId>parent</artifactId> <groupId>com.liu2m</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <!--子工程的groupId和version默认使用父工程的--> <artifactId>model</artifactId> <packaging>jar</packaging>
7. Maven插件-
在pom.xml文件的build标签里的plugins标签中使用plugin标签引入插件
-
JDK编译版本插件:方便修改项目的编译环境
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.2</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>utf-8</encoding> </configuration> </plugin>
-
Tomcat服务端插件(部署项目):无需安装Tomcat服务器就可以运行tomcat进行项目的发布与测试
<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <!-- 指定端口 --> <port>8080</port> <!-- 请求路径 --> <path>/</path> </configuration> </plugin>
8. Maven私服-
Nexus是一个强大的Maven仓库管理器,它极大地简化了自己内部仓库的维护和外部仓库的访问。
8.1 安装Nexus
- 解压Nexus的压缩包
- 以管理员身份运行cmd,切换到bin目录,执行:nexus.bat install
- 在服务中查看是否有nexus服务
- 启动Nexus:
- 方式1:cmd进入bin目录,执行:nexus.bat start
- 方式2:直接启动nexus服务
-
卸载Nexus:cmd进入bin目录,执行:nexus.bat uninstall
-
nexus的配置文件:conf/nexus.properties
8.2 nexus的仓库类型
- hosted:宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分
- proxy:代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件
- group:仓库组,用来合并多个hosted/proxy仓库
- virtual:兼容Maven1版本的jar或者插件