Maven
下载
https://maven.apache.org/download.cgi
Files:apache-maven-3.6.3-bin.zip
安装
Windows
- 解压
- 配置环境变量,加入到 Path 路径中
- 验证是否有效
mvn -v
Mac
解压
配置环境变量 M2_HOME,加入到 Path 路径中
1
2
3
4
5
6vi ~/.bash_profile
export M2_HOME=/Users/wangwz/apache-maven-3.6.3
export PATH=$PATH:$M2_HOME/bin
#退出后,执行下面命令使文件生效
source ~/.bash_profile验证是否有效,输入
mvn -v
,输出如下,说明成功1
2
3
4
5
6wangwz@wangwznoMacBook-Pro ~ % mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/wangwz/Desktop/Software/apache-maven-3.6.3
Java version: 15, vendor: Oracle Corporation, runtime: /Users/wangwz/Library/Java/JavaVirtualMachines/openjdk-15/Contents/Home
Default locale: zh_CN_#Hans, platform encoding: UTF-8
OS name: "mac os x", version: "10.15.6", arch: "x86_64", family: "mac"
学习
强烈推荐
archetype是mvn内置的一个插件,create任务可以创建一个java项目骨架
每一个骨架都会建相应的目录结构和一些通用文件,最常用的是 maven-archetype-quickstart 和 maven-archetype-webapp 骨架。maven-archetype-quickstart 骨架是用来创建一个 Java Project,而 maven-archetype-webapp 骨架则是用来创建一个 JavaWeb Project。
依赖范围
依赖范围 scope 用来控制依赖和编译,测试,运行的 classpath 的关系. 主要的是三种依赖关系如下:
- compile: 默认编译依赖范围。对于编译,测试,运行三种 classpath 都有效
- test:测试依赖范围。只对于测试 classpath 有效
- provided:已提供依赖范围。对于编译,测试的 classpath 都有效,但对于运行无效。因为由容器已经提供,例如 servlet-api
- runtime: 运行时提供。例如:jdbc 驱动
运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行 mvn install 的时候,代码会被编译,测试,打包。此外,Maven 的插件机制是完全依赖 Maven 的生命周期的,因此理解生命周期至关重要。
1 | <!-- 指明编译源代码时使用的字符编码,maven编译的时候默认使用的GBK编码, 通过project.build.sourceEncoding属性设置字符编码,告诉maven这个项目使用UTF-8来编译 --> |
Maven 仓库理解和优先级
https://swenfang.github.io/2018/06/03/Maven-Priority/
仓库的优先级别为
本地仓库 > 私服 (profile)> 远程仓库(repository)和 镜像 (mirror) > 中央仓库 (central)
maven 资源搜索
maven 的 setting 配置文件中 mirror 和 repository 的区别
Maven 依赖
依赖排除
如果本模块继承父模块依赖了某maven依赖,可以通过再依赖一遍并加上 scope:test 覆盖原依赖,达到不再依赖的结果
1 | <dependency> |
打包时排除测试
1 | //跳过测试-不执行测试用例,也不编译测试用例类 |
不打包,跳过该模块
1 | <build> |
打包时排除指定目录
1 | <build> |
profiles 定义环境变量
1 | <profiles> |
springboot application.yml 引用环境变量
1 | spring: |
jar 安装到本地仓库
安装
1 | mvn install:install-file -Dfile=/Users/mac126/work/lib/youtu-sms-sdk-1.0.0.jar -DgroupId=com.bjtcrj.sdk -DartifactId=youtu-sms-sdk -Dversion=1.0.0 -Dpackaging=jar |
使用
1 | <dependency> |
引用指定目录 jar 资源
在项目根目录下添加 lib 文件夹,然后将工程需要的 jar 文件复制到 lib 文件夹下
添加依赖到 pom.xml 文件中
- 单模块时,添加到项目 pom.xml
- 多模块时,添加到某模块 pom.xml「需要依赖资源的模块」
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15<!-- 在这里添加你的依赖 -->
<dependency>
<groupId>ldapjdk</groupId> <!-- 库名称,也可以自定义 -->
<artifactId>ldapjdk</artifactId> <!-- 库名称,也可以自定义 -->
<version>1.0</version> <!-- 版本号 -->
<scope>system</scope> <!-- 作用域 -->
<systemPath>${basedir}/lib/ldapjdk.jar</systemPath>
</dependency>
<!-- 一定要看!一定要看!一定要看! -->
<!-- basedir:所在目录-单模块时为项目根目录,多模块时为模块根目录 -->
<!-- 单模块 -->
<systemPath>${basedir}/lib/ldapjdk.jar</systemPath>
<!-- 多模块应修改为 -->
<systemPath>${basedir}/../lib/ldapjdk.jar</systemPath>查看 jar 文件 「gav」 信息方法如下:
- 打包时打入以上 jar 文件
springboot
1
2
3
4
5
6
7
8
9
10
11<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>Spring Maven 项目
把lib/目录下第三方jar包打进程序中,如上面的systemPath目录下的jar
1
2
3
4
5
6
7
8
9
10
11<build>
<resources>
<resource>
<directory>${basedir}/lib/</directory>
<includes>
<include>*.jar</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>SSM 项目 web 模块,打包引入资源并指定位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22<build>
<finalName>scm-web</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<webResources>
<resource>
<directory>${project.basedir}/../lib</directory>
<targetPath>WEB-INF/lib</targetPath>
<filtering>false</filtering>
<includes>
<include>**/*.jar</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
</plugins>
</build>
配置阿里云镜像/仓库
参考:https://yq.aliyun.com/articles/695269
单个项目
项目 pom.xml
配置阿里云 maven 仓库。通过覆盖默认的中央仓库的配置,实现中央仓库地址的变更
1 | <repositories> |
所有项目
修改 maven/conf/settings.xml
,配置阿里云仓库镜像
匹配所有远程仓库
1
<mirrorOf>*</mirrorOf>
匹配仓库 repo1 和 repo2,使用逗号分隔多个远程仓库
<mirrorOf>repo1,repo2</mirrorOf>
匹配所有远程仓库,repo1 除外,使用感叹号将仓库从匹配中排除
<mirrorOf>*,!repo1</miiroOf>
1 | <mirror> |
排除私有镜像
示例:排除 jeecg
getui-nexus
1 | <mirror> |
配置本地仓库地址
修改 maven/conf/settings.xml
1 | <localRepository>/Users/mac126/study/maven-repo/repository</localRepository> |
配置编译插件
pom.xml
1 | <build> |
依赖管理 - dependencyManagement
在项目根 pom.xml 中统一维护模块版本,并不会实际依赖,在业务模块依赖时不需要再指定版本号
1 | <dependencyManagement> |
settings.xml「推荐配置」
- 为默认中央方库 central 、jcenter 指定镜像 nexus-aliyun public 仓库
1 | <mirror> |
- 添加更多其它代理仓库。频繁使用的可以配置在这里,只有指定项目用到,只需在项目
pom.xml
中配置即可
1 | <profile> |
注意
- 依赖本项目其它模块,不需要版本信息;依赖第三方依赖,必须指定版本信息
- IDEA自带maven版本高于 3.8.1 ,导致无法下载 http maven仓库资源,可以配置为本地 低版本maven