下载

https://maven.apache.org/download.cgi

Files:apache-maven-3.6.3-bin.zip

安装

Windows

  1. 解压
  2. 配置环境变量,加入到 Path 路径中
  3. 验证是否有效 mvn -v

Mac

  1. 解压

  2. 配置环境变量 M2_HOME,加入到 Path 路径中

    1
    2
    3
    4
    5
    6
    vi ~/.bash_profile
    export M2_HOME=/Users/wangwz/apache-maven-3.6.3
    export PATH=$PATH:$M2_HOME/bin

    #退出后,执行下面命令使文件生效
    source ~/.bash_profile
  3. 验证是否有效,输入 mvn -v ,输出如下,说明成功

    1
    2
    3
    4
    5
    6
    wangwz@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"

学习

强烈推荐

一、Maven 系列教程-入门

二、Maven 项目构建过程练习

三、使用 Maven 构建项目

archetype是mvn内置的一个插件,create任务可以创建一个java项目骨架

每一个骨架都会建相应的目录结构和一些通用文件,最常用的是 maven-archetype-quickstartmaven-archetype-webapp 骨架。maven-archetype-quickstart 骨架是用来创建一个 Java Project,而 maven-archetype-webapp 骨架则是用来创建一个 JavaWeb Project。

四、Maven 核心概念

  • 依赖范围

    依赖范围 scope 用来控制依赖和编译,测试,运行的 classpath 的关系. 主要的是三种依赖关系如下:

    1. compile默认编译依赖范围。对于编译,测试,运行三种 classpath 都有效
    2. test:测试依赖范围。只对于测试 classpath 有效
    3. provided:已提供依赖范围。对于编译,测试的 classpath 都有效,但对于运行无效。因为由容器已经提供,例如 servlet-api
    4. runtime: 运行时提供。例如:jdbc 驱动
  • 运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行 mvn install 的时候,代码会被编译,测试,打包。此外,Maven 的插件机制是完全依赖 Maven 的生命周期的,因此理解生命周期至关重要。

五、聚合与继承

六、构建多模块项目

七、编码 gbk 的不可映射字符解决办法

1
2
3
4
<!-- 指明编译源代码时使用的字符编码,maven编译的时候默认使用的GBK编码, 通过project.build.sourceEncoding属性设置字符编码,告诉maven这个项目使用UTF-8来编译 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

八、使用 Nexus 搭建 Maven 私服「强烈推荐」

Maven 仓库理解和优先级

https://swenfang.github.io/2018/06/03/Maven-Priority/

仓库的优先级别为

本地仓库 > 私服 (profile)> 远程仓库(repository)和 镜像 (mirror) > 中央仓库 (central)

maven 资源搜索

maven 的 setting 配置文件中 mirror 和 repository 的区别

Maven 依赖

依赖排除

如果本模块继承父模块依赖了某maven依赖,可以通过再依赖一遍并加上 scope:test 覆盖原依赖,达到不再依赖的结果

1
2
3
4
5
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>

打包时排除测试

1
2
//跳过测试-不执行测试用例,也不编译测试用例类
mvn clean package -Dmaven.test.skip=true

不打包,跳过该模块

1
2
3
4
5
6
7
8
9
10
11
12
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--微服务模式下修改为true,跳过此打包插件,否则微服务模块无法引用-->
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>

打包时排除指定目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<build>
<!--其它配置-->
<!--打包时排除指定目录-->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>static/**</exclude>
<exclude>jeecg/**</exclude>
</excludes>
</resource>
</resources>

<!--其它示例-->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<includes>
<include>*.store</include>
<include>*.xml</include>
<include>templates/**</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<filtering>false</filtering>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>

profiles 定义环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<profiles>
<!-- 开发 -->
<profile>
<id>dev</id>
<activation>
<!--默认激活配置-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!--当前环境-->
<profile.name>dev</profile.name>
<!--配置文件前缀-->
<prefix.name>jeecg</prefix.name>
<!--Nacos配置中心地址-->
<config.server-addr>tcboot-nacos:7002</config.server-addr>
<!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID,不能使用名称,默认为空-->
<config.namespace/>
<!--Nacos配置分组名称-->
<config.group>DEFAULT_GROUP</config.group>
<!--Nacos服务发现地址-->
<discovery.server-addr>tcboot-nacos:7002</discovery.server-addr>
</properties>
</profile>
<!-- 测试 -->
<profile>
<id>test</id>
<properties>
<!--当前环境-->
<profile.name>test</profile.name>
<!--配置文件前缀-->
<prefix.name>jeecg</prefix.name>
<!--Nacos配置中心地址-->
<config.server-addr>tcboot-nacos:7002</config.server-addr>
<!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID,不能使用名称,默认为空-->
<config.namespace/>
<!--Nacos配置分组名称-->
<config.group>DEFAULT_GROUP</config.group>
<!--Nacos服务发现地址-->
<discovery.server-addr>tcboot-nacos:7002</discovery.server-addr>
</properties>
</profile>
<!-- 生产 -->
<profile>
<id>prod</id>
<properties>
<!--当前环境,生产环境为空-->
<profile.name>prod</profile.name>
<!--配置文件前缀-->
<prefix.name>jeecg</prefix.name>
<!--Nacos配置中心地址-->
<config.server-addr>tcboot-nacos:7002</config.server-addr>
<!--Nacos配置中心命名空间,用于支持多环境.这里必须使用ID,不能使用名称,默认为空-->
<config.namespace/>
<!--Nacos配置分组名称-->
<config.group>DEFAULT_GROUP</config.group>
<!--Nacos服务发现地址-->
<discovery.server-addr>tcboot-nacos:7002</discovery.server-addr>
</properties>
</profile>
</profiles>

springboot application.yml 引用环境变量

1
2
3
4
5
spring:
application:
name: @artifactId@
profiles:
active: @profiles.active@

jar 安装到本地仓库

安装

1
2
3
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

mvn install:install-file -Dfile=DmJdbcDriver18.jar -DgroupId=com.dameng -DartifactId=Dm8JdbcDriver18 -Dversion=8.1.1.193 -Dpackaging=jar

使用

1
2
3
4
5
<dependency>
<groupId>com.bjtcrj.sdk</groupId>
<artifactId>youtu-sms-sdk</artifactId>
<version>1.0.0</version>
</dependency>

引用指定目录 jar 资源

  1. 在项目根目录下添加 lib 文件夹,然后将工程需要的 jar 文件复制到 lib 文件夹下

  2. 添加依赖到 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」 信息方法如下:

image-20210619102128132
  1. 打包时打入以上 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<repositories>
<repository>
<id>central</id>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<layout>default</layout>
<!-- 是否开启发布版构件下载 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否开启快照版构件下载 -->
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>

<!-- com.e-iceblue 私服仓库 -->
<repository>
<id>com.e-iceblue</id>
<url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>

所有项目

修改 maven/conf/settings.xml,配置阿里云仓库镜像

  • 匹配所有远程仓库

    1
    <mirrorOf>*</mirrorOf>
  • 匹配仓库 repo1 和 repo2,使用逗号分隔多个远程仓库

    <mirrorOf>repo1,repo2</mirrorOf>
    
  • 匹配所有远程仓库,repo1 除外,使用感叹号将仓库从匹配中排除

    <mirrorOf>*,!repo1</miiroOf>
    
1
2
3
4
5
6
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

排除私有镜像

示例:排除 jeecg getui-nexus

1
2
3
4
5
6
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots,!getui-nexus</mirrorOf>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

配置本地仓库地址

修改 maven/conf/settings.xml

1
<localRepository>/Users/mac126/study/maven-repo/repository</localRepository>

配置编译插件

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

依赖管理 - dependencyManagement

在项目根 pom.xml 中统一维护模块版本,并不会实际依赖,在业务模块依赖时不需要再指定版本号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-module-activiti</artifactId>
<version>${boot.version}</version>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-module-event</artifactId>
<version>${boot.version}</version>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-module-basic</artifactId>
<version>${boot.version}</version>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-module-scm-api</artifactId>
<version>${boot.version}</version>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-module-scm-biz</artifactId>
<version>${boot.version}</version>
</dependency>
<dependency>
<groupId>org.jeecgframework.boot</groupId>
<artifactId>jeecg-module-event-wx</artifactId>
<version>${boot.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

settings.xml「推荐配置」

  • 为默认中央方库 central 、jcenter 指定镜像 nexus-aliyun public 仓库
1
2
3
4
5
6
 <mirror>
<id>nexus-aliyun</id>
<mirrorOf>central,jcenter,!jitpack.io</mirrorOf>
<name>Nexus aliyun</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
  • 添加更多其它代理仓库。频繁使用的可以配置在这里,只有指定项目用到,只需在项目pom.xml中配置即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<profile>
<repositories>
<repository>
<id>jcenter</id>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>apache snapshots</id>
<url>https://maven.aliyun.com/repository/apache-snapshots</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring</id>
<url>https://maven.aliyun.com/repository/spring</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-plugin</id>
<url>https://maven.aliyun.com/repository/spring-plugin</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>google</id>
<url>https://maven.aliyun.com/repository/google</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>gradle-plugin</id>
<url>https://maven.aliyun.com/repository/gradle-plugin</url>
</repository>
<repository>
<id>releases</id>
<url>https://maven.aliyun.com/repository/releases</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>snapshots</id>
<url>https://maven.aliyun.com/repository/snapshots</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>Igexin Repository</id>
<url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</url>
</repository>
</repositories>
</profile>

注意

  • 依赖本项目其它模块,不需要版本信息;依赖第三方依赖,必须指定版本信息
  • IDEA自带maven版本高于 3.8.1 ,导致无法下载 http maven仓库资源,可以配置为本地 低版本maven