Apache Maven快速上手
Maven的项目结构
src
目录下分为main
和test
目录,分别用于存放源码和测试代码。main
目录下分为java
和resource
目录,分别用于存放java源码和静态资源文件(包括图片、配置文件等)。pom.xml
是Maven的核心配置,包括项目的依赖、插件以及各种配置。
<groupId>
、<artifactId>
、<version>
用于唯一区别每个项目。groupId
一般用于指定组名称,命名规则一般和包名一致,一个组下面可以有很多个项目。artifactId
一般用于指定项目在当前组中的唯一名称。version
代表项目版本。
参考示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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>org.example</groupId>
<artifactId>MavenHelloWorld</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
导入依赖
在<dependencies>
中即可引入所需要的依赖。每个依赖需在<dependency>
中,同样具有groupId
、artifactId
、version
三标签。
1 |
|
依赖的额外属性
除上述三标签外,依赖还可以被添加<type>
、<scope>
、<optional>
、<exclusions>
以及<system>
标签。
type
:依赖类型,默认为jar。scope
:依赖的作用域。compile
:在编译、运行、测试时均有效。未指定依赖作用域时默认使用。provided
:在编译、测试时有效,运行时无效。runtime
:在运行、测试时有效,在编译时无效。
最典型的便是JDBC驱动。我们使用的始终是其所提供的接口,不需要直接使用特定驱动中的类或是方法,因此只需在运行时包含即可。1
2
3
4
5
6<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.34</version>
<scope>runtime</scope>
</dependency>test
:仅在测试时有效。system
:作用域和<scope>
下的<provided>
相同,但并不是从远程仓库获取依赖,而是从本地导入。如果<scope>
为system
,则添加一个systemPath
来指定jar文件的位置。
参考示例:1
2
3
4
5
6
7<dependency>
<groupId>org.example</groupId>
<artifactId>extension</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>D://maven/test.jar</systemPath>
</dependency>
optional
:依赖是否可选。exclusions
:消除传递性依赖。
通过<exclusion>
子标签可以确定要排除哪一个传递依赖。
参考示例:1
2
3
4
5
6
7
8
9
10
11
12<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.14</version>
<exclusions>
<!-- 确定排除spring-context中的commons-logging模块 -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
依赖的可选和排除
如果我们的项目引用了其他依赖,别人在引用我们的项目时,会连带引入我们的项目所使用的依赖。我们可以给依赖添加optional
标签表示此依赖是可选的,默认在导入依赖时,不会导入可选的依赖。
1 | <option>true</option> |
如果我们在引入别人项目的时候,发生了上述情况,我们可以通过<exclusion>
排除不必要的依赖。
1 | <dependency> |
继承和多模块
一个Maven项目可以继承自另一个Maven项目,比如多个子项目都需要父项目的依赖,我们就可以使用继承关系来快速配置。
1 |
|
通过<parent>
标签,表示此项目是父项目的子项目,子项目直接继承父项目的groupId
,并继承父项目的所有依赖。
我们还可以让父Maven项目统一管理所有的依赖,包括版本号等,子项目可以选取需要的作为依赖,而版本全由父项目管理,使用<dependencyManagement>
标签,这样父项目就完全作为依赖统一管理。
1 | <dependencyManagement> |
依赖统一管理后,子项目只需要用什么拿什么,无需指定版本。但如果父项目在该标签外面依旧存在<dependencies>
标签,其内部的依赖依旧是直接继承。