maven资料

maven书籍和视频介绍:http://pan.baidu.com/s1hq00qLA
国外资料介绍、引导、书籍:http://www.tutorialspoint.com/maven/index.htm
maven官网:http://maven.apache.org/

简单知识点

  • maven是什么:java管理和构建工具,管理定义项目结构、项目依赖,用统一方式进行自动化构建

    1. 项目结构
      image-20250212091015201

    2. 构建流程:编译->测试->打包->发布(部署)
      只需要服务器安装Tomcat在启动构建,就会自动执行:清理->编译->测试->报告->打包->部署,这样的一套流程
      image-20250212091444753

    3. 包管理:

    • 旧有方式:一个项目下有一个lib,java包放入lib中,所以随着项目增多,java包也增长
    • maven仓库管理:
      1. 多个项目共享同一个仓库,用仓库将java包和项目分离
      2. 依赖传递机制解决项目内java包之间的版本冲突
  • maven仓库:1、OSChina, 2、公共仓库

  • 使用仓库的目的:将不同项目的java包统一管理(下载,配置,规则统一,包的版本管理)

  • 配置maven配置文件D:\maven\maven3.1.1\conf\settings.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
    <localRepository>D:/maven/my_local_repository</localRepository>
    <mirrors>
    <mirror>
    <id>osc</id>
    <mirrorOf>central</mirrorOf>
    <url>http://maven.oschina.net/content/groups/public/</url>
    </mirror>
    <mirror>
    <id>osc_thirdparty</id>
    <mirrorOf>thirdparty</mirrorOf>
    <url>http://maven.oschina.net/content/repositories/thirdparty/</url>
    </mirror>
    </mirrors>
    <profiles>
    <profile>
    <id>osc</id>
    <activation>
    <activeByDefault>true</activeByDefault>
    </activation>
    <repositories>
    <repository>
    <id>osc</id>
    <url>http://maven.oschina.net/content/groups/public/</url>
    <repository>
    </repositories>
    <pluginRepositories>
    <pluginRepository>
    <id>osc</id>
    <url>http://maven.oschina.net/content/groups/public/</url>
    </pluginRepository>
    </pluginRepositories>
    </profile>
    </profiles>
  • maven脚手架(模版)不用自己书写:http://docs.codehaus.org/display/MAVENUSER/Archetypes+List

    • maven命令行

      1. 创建项目:mvn archetype:generate
    • maven在IDEA中

    • maven项目结构规范
      image-20250211173500451

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    -project <artifactId>
    -src
    -main 项目主体文件
    -java 放.java文件
    - 包名 <groupId>
    -resources 除了.java文件都可以放在里面(例如.xml, property), 即配置文件,静态文件(.html,.css,.js, image图片等不需要java编译,模版页jsp)
    -webapp
    -test 单元测试文件Junit
    -java 放.java文件
    -resources 单元测试中需要用的配置文件
    -pom.xml 标志着一个maven项目,maven配置文件

    image-20250212145536139

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?xml version="1.0" encoding="UTF-8"?>
<!-- Maven 项目对象模型(POM) 文件的根元素 -->
<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">

<!-- POM文件的模型版本 -->
<modelVersion>4.0.0</modelVersion>

<!-- 项目坐标,包括组织ID,项目ID和版本 -->
<groupId>com.example</groupId> <!-- 项目的组织或公司ID -->
<artifactId>my-java-app</artifactId> <!-- 项目的唯一ID -->
<version>1.0.0</version> <!-- 项目的版本号 -->
<packaging>jar</packaging> <!-- 项目打包类型: jar, war,po m -->
<name>My Maven Project</name> <!-- 项目的名称,可选 -->
<!-- 项目的描述 -->
<description>This is a sample Maven project.</description>
<!-- 项目的URL,可选 -->
<url>http://example.com/my-maven-project</url>
<!-- 属性 变量 -->
<properties>
<!-- jdk版本 -->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<!-- 编码方式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 依赖版本 -->
<javax.servlet.version>3.1.0</javax.servlet.version>
</properties>
<!-- 项目依赖声明部分 -->
<dependencies>
<!-- 对Spring框架核心模块的依赖 -->
<dependency>
<groupId>org.springframework</groupId> <!-- 依赖的组织或公司ID -->
<artifactId>spring-core</artifactId> <!-- 依赖的唯一ID -->
<version>5.2.6.RELEASE</version> <!-- 依赖的版本号 -->
</dependency>
<!-- 其他依赖可以在这里添加 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<!-- 引用变量 -->
<version>${javax.servlet.version}</version>
</dependency>
<!-- 单元测试依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope> <!-- 设置依赖范围:system, runtime, compile, provided, test -->
</dependency>
</dependencies>

<!-- 构建配置部分 -->
<build>
<plugins>
<!-- Maven编译插件的配置 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId> <!-- 插件的组织或公司ID -->
<artifactId>maven-compiler-plugin</artifactId> <!-- 插件的唯一ID -->
<version>3.8.1</version> <!-- 插件的版本号 -->
<configuration>
<source>1.8</source> <!-- Java源代码的兼容版本 -->
<target>1.8</target> <!-- Java目标代码的兼容版本 -->
</configuration>
</plugin>
<!-- 其他构建插件可以在这里添加 -->
</plugins>
</build>
<!-- 构建配置 -->
<build>
<plugins>
<!-- Maven插件配置示例 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- 其他构建插件,如maven-surefire-plugin等 -->
</plugins>

<!-- 资源配置 -->
<resources>
<!-- 描述存放资源的目录,该路径相对POM路径 -->
<resource>
<directory>src/main/java</directory>
<!-- 包含的模式列表,例如**/*.xml -->
<includes>
<include>**/*.xml</include>
</includes>
<!-- 是否使用参数值代替参数名 -->
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>

<!-- 仓库配置部分 -->
<repositories>
<!-- Maven中央仓库的配置 -->
<repository>
<id>central</id> <!-- 仓库的唯一ID -->
<url>https://repo.maven.apache.org/maven2</url> <!-- 仓库的URL地址 -->
</repository>
<!-- 其他仓库可以在这里添加 -->
</repositories>
</project>
  • 坐标,,:三个坐标决定了jar包的位置,首先在本地仓库查找,没找到去镜像仓库寻找,找到了在拉取到本地仓库

    • 项目:一个项目可以有多个模块,聚合maven项目,一个项目也可以就是一个工程没有模块
    • 一项目即一个工程时命名规则
      • groupId: 组织域名逆序 例如com.baidu
      • artifactId: 项目名 例如OA, hello
      • version: 1.0-SNAPSHOT, 1.0-release
    • 一项目包含多个模块时命名规则,例如OA项目包含前端、后端、common三个模块
      • groupId: 组织域名+项目名逆序 例如com.baidu.oa
      • artifactId: 模块名 例如前端模块, 后端模块,common模块
      • version: 1.0-SNAPSHOT, 1.0-release
  • 依赖:如何通过坐标信息引用其他jar包,也称为引用依赖,去中央仓库找依赖https://mvnrepository.com

  • 属性变量: 设置编译器的jdk版本,编码方式,依赖版本,可以统一管理版本的地方

  • 依赖范围:

    1. compile:编译、测试、打包、运行都需要依赖包
    2. test:测试、运行需要依赖包
    3. runtime:运行、测试需要依赖包
    4. provided:编译、测试、运行需要依赖包
    5. import: 只能用在,用于继承父依赖中的多个依赖
      |范围|编译|测试|运行|打包|使用场景|
      | -----|-----|-----|-----|-----|-----|
      |compile|$\checkmark$|$\checkmark$|$\checkmark$|$\checkmark$|默认|
      |test||$\checkmark$|||测试功能|
      |runtime||$\checkmark$|$\checkmark$||反射,运行时加载包|
      |provided|$\checkmark$|$\checkmark$|$\checkmark$||部署的服务器提供了该依赖|
      |system|$\checkmark$|$\checkmark$|$\checkmark$||引用本地物理路径jar包, 元素用于制定本地系统中 jar 文件的路径|
      |import|||||继承其他包的所有依赖|
  • : 是否传递依赖,默认false代表会传递依赖

非pom.xml的手动打包流程

使用Lifecycle可以分阶段完成部分生命周期,注:双击某个周期阶段,则该阶段之前的周期阶段都会执行

image-20250213151853305

  • clean: 清除生成的target目录,缓存内容。
  • compile: 编译代码
  • test: 测试test目录中的代码
  • package: 生成.jar或者.war
  • install: 将生成的.jar或者.war传到本地仓库

依赖传递

image-20250213171833240

  • 背景:B项目依赖mysql驱动,A项目依赖B项目
    要求:

    1. A项目需要依赖mysql驱动:B项目的mysql依赖范围用compile,或者用false。
    2. A项目不需要依赖mysql驱动:B项目的mysql依赖范围用test,或者用true。
  • 背景:A项目排除B项目的依赖,但是没法在B项目的pom.xlm中使用
    可以在A项目中使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    A项目的pom.xml文件
    <dependencies>
    <dependency>
    <groupId>B项目groupId</groupId>
    <artifactId>B项目artifactId</artifactId>
    <version>B项目version</version>
    <exclusions>
    <exclusion>
    <groupId>B项目中的某个依赖groupId</groupId>
    <artifactId>B项目中的某个依赖artifactId</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    </dependencies>

  • 查看依赖路径
    image-20250214103926155
    image-20250214103955465
    image-20250214104149326

maven聚合

一个项目拆成了多个工程分别开发缺点

  • 可能需要将idea窗口拆成多个来回切换
  • 一个子工程依赖另一个子工程时,另一个子工程必须要先完成install生命周期
    maven聚合使用一个总工程将各个模块工程汇聚起来,作为一个整体对应完整的项目。
    • 项目:整体
    • 模块:部分
      maven聚合项目
  1. 可以把src删掉,因为聚合项目通常只是管理子工程
  2. pom.xml中的修改默认jar改成pom,代表不是一个具体的包
  3. 建子模块
    image-20250214110242901
    image-20250214110522248
  4. 在总工程中pom.xml中增加管理子工程,可以在总工程中编译同时自动在管理的子工程中自动编译。

maven继承

image-20250214134816240

  • 背景:各子项目都需要同一个依赖,可以将该依赖放到总工程中,其他模块继承父项目
    1. 在总工程pom.xml中添加依赖
    2. 在子工程pom.xml中添加继承, 取消自己的
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <parent>
    <groupId>总工程groupId</groupId>
    <artifactId>总工程artifactId</artifactId>
    <version>总工程version</version>
    </parent>
    <!--
    当采用继承方式groupId, version都会被继承自父maven
    <groupId>子工程groupId</groupId>
    <version>子工程version</version>
    -->
    <artifactId>子工程artifactId</artifactId>
  • 背景:父项目中的部分依赖是某些子项目不一定需要的,可以将可选依赖放到总工程下,其他模块继承父项目
    1. 在总工程pom.xml中的下添加依赖
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!-- 子工程必须需要的依赖 -->
    <dependencies>
    <dependency>
    <groupId>必须的依赖groupId</groupId>
    <artifactId>必须的依赖artifactId</artifactId>
    <version>必须的依赖version</version>
    </dependency>
    </dependencies>
    <!-- 子工程非必须需要的依赖 -->
    <dependenceManagement>
    <dependencies>
    <dependency>
    <groupId>非必须的依赖groupId</groupId>
    <artifactId>非必须的依赖artifactId</artifactId>
    <version>非必须的依赖version</version>
    </dependency>
    </dependencies>
    </dependenceManagement>
    1. 在子工程pom.xml中添加继承, 取消自己的,添加在总工程中需要的依赖,但是取消
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <parent>
    <groupId>总工程groupId</groupId>
    <artifactId>总工程artifactId</artifactId>
    <version>总工程version</version>
    </parent>
    <!--
    当采用继承方式groupId, version都会被继承自父maven
    <groupId>子工程groupId</groupId>
    <version>子工程version</version>
    -->
    <artifactId>子工程artifactId</artifactId>
    <dependencies>
    <dependency>
    <groupId>子工程需要的依赖groupId</groupId>
    <artifactId>子工程需要的依赖artifactId</artifactId>
    <!--
    <version>子工程需要的依赖version</version>
    -->
    </dependency>
    </dependencies>

maven总结