简介
Maven作用: (1) 依赖管理,(2) 构建项目 (编译测试打包发布)
仓库:本地仓库 > 私服 > 中央仓库 // 仓库的作用是存放各种jar包
下载坐标网址:https://repo1.maven.org/maven2/
**查看依赖网址:**https://mvnrepository.com
1 下载安装
1.1 下载
官网:https://maven.apache.org/index.html
官网:www.maven.apache.org/docs/history.html

1.2 右键解压

1.3 配置环境变量
注释:需要JAVA_HOME,与JDK环境变量

1.4 测试(输入mvn 或者 mvn -v)
注释:首次执行mvn命令会在c盘user下新建.m2文件夹

1.5 修改配置
打开conf/settings文件

1.5.1 修改本地仓库目录
从中央服务器或私服下载的jar包会存放在当前目录下

XML
<localRepository>D:\.m2\repository</localRepository>
1.5.2 修改镜像
注释:为了提高国内依赖的下载速度
阿里云镜像:https://maven.aliyun.com/repository/central
华为云镜像:https://repo.huaweicloud.com/repository/maven/
腾讯云镜像:https://mirrors.cloud.tencent.com/nexus/repository/maven-public/
中科大镜像:https://mirrors.ustc.edu.cn/maven-central/
XML
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/central</url>
</mirror>
1.5.3 修改maven的JDK版本
注释:为了确保编译构建与项目的版本一致
XML
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<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>
2 创建Maven项目
Maven项目结构
2.1 Maven命令创建项目
2.1.1 命令创建Java项目
(1) 命令
XML
mvn archetype:generate -DgroupId=com.myacompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
(2) 执行
2.1.2 命令创建Web项目
(1) 命令
XML
mvn archetype:generate -DgroupId=com.myacompany.app -DartifactId=my-web-app -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
(2) 执行
2.2 工具创建Maven项目
2.2.1 Eclipse创建Maven Web项目
File > New > Other
2.2.2 IDEA创建Maven Web项目
FIle > New > Module...

2.2.3 STS创建Maven Web项目
略
3 maven命令
3.1 生命周期
(1) 编译:mvn compile // 将java编译成target下class文件
(2) 清理:mvn clean // 清除target下class文件
(3) 编译测试类:mvn test-compile // 生成测试类的class文件
(4) 测试:mvn test // 运行test包下的测试类
(5) 打包:mvn package // 将项目打包(jar, war)
注释:jar包可以直接打包,war打包如果出错需要在pom.xml中配置插件
XML
<!-- 打war包插件 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
(6) 安装:mvn install // 将工厂发布到本地库(配置文件.m2下)
(7) 发布:mvn deploy //将工程发布到远程库(如Nexus)
3.2 组合命令
(1) 清理-发布:mvn clean install //按顺序执行
(2) 发布-跳过测试:mvn install -DskipTests
(3) 清理-打包-跳过测试:mvn clean package -DskipTests
(4) 安装-多环境id:mvn install -P [pom的profiles环境id]
3.3 其它命令
(1) 查看依赖树:mvn dependency:tree
(2) 分析依赖:mvn dependency:analyze
4 pom文件
根目录:project
Pom版本:modelVersion// XML的版本,无需改动
组织名:groupId// 域名+公司名(com.example)
项目名:artifactId// 项目-模块
版本号:version// 主版本.此版本.修订版 ,快照(SNAPSHOT)稳定(RELEASE)
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.example</groupId>
<artifactId>idea_maven</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
打包方式:packaging// jar(默认), war , pom(不打包)
XML
<packaging>war</packaging>
多环境开发:profiles
XML
<profiles>
<profile>
<id>env_dep</id>
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/dbname</jdbc.url>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>env_pro</id>
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3307/dbname</jdbc.url>
</properties>
</profile>
<profile>
<id>env_test</id>
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3308/dbname</jdbc.url>
</properties>
</profile>
</profiles>
版本统一:properties
XML
<properties>
<xx.version>1.1.2</xx.version>
<maven.compiler.source>17</maven.compiler.source><!--配置jdk版本(maven工程用)-->
<maven.compiler.target>17</maven.compiler.target><!--配置jdk版本(maven工程用)-->
<project.build.sourceEncoding>UTF-8</..><!--配置构建编码(maven工程用)-->
<jdbc.url>jdbc:mysql://127.0.0.1:3306/dbname</..><!--maven配置数据库-->
</properties>
依赖管理:dependencies
依赖:dependency
依赖组织名:groupId
依赖项目名:artifactId
依赖版本号:version
依赖范围:socpe// 可选配置,
(1)compile(默认:编译,测试,运行)
(2)provided(编译,测试) // 用于服务器已经提供的jar包,例如servlet
(3)runtime(测试,运行) // 例如jdbc接口不用编译
(4)test(测试)
(5)system(编译,测试) // Maven以外系统提供,不常用
(6)import// 与dependencyManagement配合使用,实现继承
XML
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>${xx.version}</version> <!--对应版本统一版本号-->
</dependency>
编译相关:build
打包配置:resources// main/resources下文件默认打包到classes下, main/java下文件不打包
XML
<build>
<resources>
<resourece>
<directory>src/main/java/</directory> <!--可以打包resources包以外的配置文件-->
<includes>
<include>**/*.xml</include> <!--打包指定目录下所有.xml文件-->
</includes>
</resource>
<resource>
<directory>../项目名/src/main/resrources/</directory>
<filtering>true</filtering> <!--使目标文件可以解析${}-->
<!--让jdbc.properties可识别pom的properties属性-->
<!-- jdbc.properties( jdbc.url=${jdbc.url} )-->
</resource>
<!--注释:可以配置一个文件,找到全部项目下的配置-->
<!-- <directory>${project.basedir}/src/main/resources</directory>-->
</resources>
</build>
插件:plugins
XML
<build>
<plugins>
<!-- 解决tomcat7中文乱码问题-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artrfactId>
<version>2.2</version>
<configuration>
<port>8090</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
<server>Tomcat7</server>
</configuration>
</plugin>
<!-- war打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
</build>
5 模块化
5.1 子模块(服务器端)
pom.xml(<packaging>=jar默认可不写)
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">
<artifactId>maven_dao</artifactId>
<packaging>jar</packaging>
<parent>
<artifactId>maven_modules</artifactId>
<groupId>com.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
</project>
5.2 子模块(Web端)
pom.xml (<packaging>=war)
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">
<artifactId>maven_webapp</artifactId>
<packaging>war</packaging>
<parent>
<artifactId>maven_modules</artifactId>
<groupId>com.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
</project>
<relativePath>:// 指定父工程位置,默认从上层目录查找,不在上层则需要指定
XML
<parent>
<artifactId>maven_modules</artifactId>
<groupId>com.example</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../主工程名/pom.xml</relativePath>
</parent>
**<groupId>**子工程groupId:继承父工程后,与父工程一致时,可省略不写
**<artifactId>**子工程artifactId:
**<version>**子工程version:继承父工程后,与父工程一致时,可省略不写
XML
<groupId>com.example</groupId>
<artifactId>maven_webapp</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>:父工程添加的dependency 子工程可以直接使用,并且一定会进行依赖。
<groupId>:父工程添加的dependencyManagement,子工程需要手动添加依赖。
<artifactId>:父工程添加的dependencyManagement无需指定版本号。
5.3 父工程(pom.xml)
pom.xml (<packaging>=pom) // 当前项目不做编译时指定为 pom
<parent>: springboot项目可以为根项目指定父工程
<dependencyManagement>:定义子模块可以选择性引入的依赖,子工程引入不加版本号
XML
<dependencyManagement>
<dependencies>
<dependency>
<groupId>x</groupId>
<artifactId>x</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>:定义子模块一定会引入的依赖
XML
<dependencies>
<dependency>
<groupId>x</groupId>
<artifactId>x</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>:定义子模块可以选择性引入的插件,子模块无需指定版本号
XML
<build>
<pluginManagemnt>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8085</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</pluginManagemnt>
</build>
<modules>:模块管理,编辑主工程,会将子工程一起编译(与定义顺序无关,先编译底层项目)
XML
<modules>
<module>maven_pojo</module>
<module>maven_dao</module>
<module>maven_service</module>
<module>maven_controller</module>
<module>maven_webapp</module>
</modules>
6 依赖管理
6.1 依赖传递
工程1 > 工程2 > 工程3 // 工程1依赖工程2,工程2依赖工程3
原则: 工程1可以使用工程2的依赖(工程3)
传递优先级:层级浅的优先,同级先定义的依赖优先使用
6.2 依赖范围
dependency的scope属性,〇表示存在于该阶段,✖表示不存在于该阶段
(1)compile(编译〇,测试〇,运行〇)// 默认,不写scope的默认属性
(2)provided(编译〇,测试〇,运行✖) // 用于服务器已经提供的jar包,例如servlet
(3)runtime(编译✖,测试〇,运行〇) // 例如jdbc接口不用编译
(4)test(编译✖,测试〇,运行✖)
(5)system(编译〇,测试〇,运行✖) // Maven以外系统提供,不常用
(6)import// 与dependencyManagement配合使用,实现继承
6.3 依赖范围传递
工程1 > 工程2 > 工程3 // 工程1依赖工程2,工程2依赖工程3
6.3.1 compile(可以传递)
工程1 (工程2,scope=compile),工程3会传递到工程1中
6.3.2 provided(部分传递)
工程1 (工程2,scope=provided),工程2 (工程3,scope=provided),工程3会传递到工程1中
工程1 (工程2,scope=provided),工程2 (工程3,scope=compile),工程3不传递
工程1 (工程2,scope=provided),工程2 (工程3,scope=runtime),工程3不传递
6.3.3 runtime(部分传递)
工程1 (工程2,scope=runtime),工程2 (工程3,scope=runtime),工程3会传递到工程1中
工程1 (工程2,scope=runtime),工程2 (工程3,scope=compile),工程3不传递
工程1 (工程2,scope=runtime),工程2 (工程3,scope=provided),工程3不传递
6.3.4 test(不可传递)
工程1 (工程2,scope=test),工程3不传递
6.3.5 system(不可传递)
工程1 (工程2,scope=system),工程3不传递
6.4 依赖冲突
6.4.1 自动选择
根据依赖传递的优先级(层级浅或同级先定义的优先),自动选择
6.4.2 手动选择
(1) 可选依赖
工程1 > 工程2 > 工程3 (工程1 依赖 工程2, 工程2 依赖 工程3)
optional: true(不对外公开),false(默认:对外公开)
XML
<!-- 工程1pom -->
<dependency>
<groupId>工程2</groupId>
<artifactId>工程2</artifactId>
</dependency>
XML
<!-- 工程2pom -->
<dependency>
<groupId>工程3</groupId>
<artifactId>工程3</artifactId>
<version>...</version>
<optional>true</optional>
</dependency>
(2) 排除依赖
工程1 > 工程2 > 工程3 (工程1 依赖 工程2, 工程2 依赖 工程3)
exclusions: 指定依赖的工程内 不对其依赖的子工程,不用指定版本号
XML
<!-- 工程1pom -->
<dependency>
<groupId>工程2</groupId>
<artifactId>工程2</artifactId>
<version>...</version>
<exclusions>
<exclusion>
<groupId>工程3</groupId>
<artifactId>工程3</atrifactId>
</exclusion>
</exclusions>
</dependency>
XML
<!-- 工程2pom -->
<dependency>
<groupId>工程3</groupId>
<artifactId>工程3</artifactId>
<version>...</version>
</dependency>
7 nexus私服
7.1 下载安装
下载网址:https://help.sonatype.com/repomanager3/download
下载Windows版

解压缩

注释:nexus-3.77.1-01(服务器),sonatype-work(工作空间)
执行安装

命令启动
cd nexus的bin目录
启动命令: ./nexus /run

启动成功

7.2 访问
注释:端口号可通过 etc/nexus-default.properties的application-port=8081来修改,默认8081
如若访问一直加载,通过控制台 ctrl+c 终止运行后(访问成功)
登录

用户名:admin
密码:在下记安装目录的提示路径下

登录成功

重新设置密码



设置匿名访问(上边:允许匿名访问,下边:禁止匿名访问)



7.3 仓库
maven-central:中央仓库或代理(链接)
maven-public:外部下载jar包的存放位置
maven-releases:内部开发jar包正式版
maven-snapshots:内部开发jar包测试版
nuget-group:ASP.NET相关
nuget-hosted:ASP.NET相关
nuget-org-praxy:ASP.NET相关
注释:初始仓库双击打开都是空的。
7.3.1 修改中央仓库镜像地址
https://maven.aliyun.com/repository/public

7.3.2 修改默认端口
修改nexus私服的etc目录下的nexus-default.properties文件
7.3.3 创建仓库
指定名称

创建仓库

7.3.4 仓库添加到管理列表

7.4 Jar下载与发布
7.4.1 开发人员通过Nexus下载Jar
修改开发人员本地仓库配置文件(可提前备份)

设置本地仓库(<localRepository>D:\.m2\repository-nexus</localRepository>)

配置镜像

XML
<mirror>
<id>nexus-mine</id>
<mirrorOf>central</mirrorOf>
<name>Nexus mine</name>
<url>http://192.168.1.100:8081/repository/maven-public/</rl>
</mirror>
配置访问密码(Nexus不允许匿名访问时设置)
XML
<server>
<id>nexus-mine</id>
<username>admin</username>
<password>pws</password>
</server>
下载jar包:通过mvn命令(清空,编译等)会自动下载jar包到私服仓库
7.4.2 发布Jar到Nexus
修改工程根pom配置文件(配置上传到私服的路径)
注释:执行命令 mvn deploy 将 jar包或war包发布到私服

XML
<snapshotRepository>
<id>nexus-mine</id>
<name>Nexus Snapshot</name>
<url>http://192.168.1.100:8081/repository/maven-snapshots</url>
</snapshotRepository>
7.4.3 引用别人Jar包
修改项目的Pom文件(从指定仓库中下载依赖)

7.5 Nexus操作
7.5.1 添加普通用户
