Maven配置文件
pom.xml
<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>MavenTest</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
Maven配置文件是以project
为根节点,而modelVersion
定义了当前模型的版本,一般是4.0.0,不需要修改
groupID
、artifactID
、version
这三个元素合在一起,用于唯一区别每个项目
-
groupId
一般用于指定组名称,命名规则一般和包名一致,比如我们这里使用的是org.example
,一个组下面可以有很多个项目。 -
artifactId
一般用于指定项目在当前组中的唯一名称,也就是说在组中用于区分于其他项目的标记。 -
version
代表项目版本,随着我们项目的开发和改进,版本号也会不断更新(这里的SNAPSHOT代表快照,一般表示这是一个处于开发中的项目,正式发布项目一般只带版本号)
Maven依赖导入
<dependencies>
//里面填写的就是所有的依赖
</dependencies>
查找依赖的坐标https://mvnrepository.com/
将需要的依赖直接添加进dependencies
节点中即可
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
Maven下载的依赖会保存到本地的一个.m2
文件夹中,这是Maven本地仓库文件夹,默认建立在C盘用户文件下
为Maven配置镜像源
打开IDEA的安装目录,找到安装根目录/plugins/maven/lib/maven3/conf
文件夹,找到settings.xml
文件,打开编辑:
找到mirros标签,添加以下内容:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
Maven依赖作用域
依赖额外属性:
- type:依赖的类型,对于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar
- scope:依赖的范围(作用域,着重讲解)
- optional:标记依赖是否可选
- exclusions:用来排除传递性依赖(一个项目有可能依赖于其他项目,就像我们的项目,如果别人要用我们的项目作为依赖,那么就需要一起下载我们项目的依赖,如Lombok
scope
属性决定了依赖作用域范围:
- compile :为默认的依赖有效范围。如果在定义依赖关系的时候,没有明确指定依赖有效范围的话,则默认采用该依赖有效范围。此种依赖,在编译、运行、测试时均有效。
- provided :在编译、测试时有效,但是在运行时无效,也就是说,项目在运行时,不需要此依赖,比如我们上面的Lombok,我们只需要在编译阶段使用它,编译完成后,实际上已经转换为对应的代码了,因此Lombok不需要在项目运行时也存在。
- runtime :在运行、测试时有效,但是在编译代码时无效。比如我们如果需要自己写一个JDBC实现,那么肯定要用到JDK为我们指定的接口,但是实际上在运行时是不用自带JDK的依赖,因此只保留我们自己写的内容即可。
- test :只在测试时有效,例如:JUnit,我们一般只会在测试阶段使用JUnit,而实际项目运行时,我们就用不到测试了
system:作用域和provided是一样的,但是它不是从远程仓库获取,而是直接导入本地Jar包:
<dependency> <groupId>javax.jntm</groupId> <artifactId>lbwnb</artifactId> <version>2.0</version> <scope>system</scope> <systemPath>C://学习资料/4K高清无码/test.jar</systemPath> </dependency>
Maven可选依赖
当项目中的某些依赖不希望被使用此项目作为依赖的项目使用时,我们可以给依赖添加optional
标签表示此依赖是可选的,默认在导入依赖时,不会导入可选的依赖:
<optional>true</optional>
举例说明:
当前有三个项目A,B,C,项目A依赖项目B,项目B依赖项目C,正常情况下项目C会被自动传递给项目A,这叫做项目的传递性依赖,当项目B将项目C标记为可选依赖的时候,项目A在引用项目B时,不会自动包含项目C。除非你在项目 A 的 pom.xml
中显式地添加对项目 C 的依赖。
Maven排除依赖
排除依赖来防止添加不必要的依赖:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.8.1</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
Maven常用命令
我们可以看到在IDEA右上角Maven板块中,每个Maven项目都有一个生命周期,实际上这些是Maven的一些插件,每个插件都有各自的功能,比如:
-
clean
命令,执行后会清理整个target
文件夹,在之后编写Springboot项目时可以解决一些缓存没更新的问题。 -
validate
命令可以验证项目的可用性。 -
compile
命令可以将项目编译为.class文件。 -
install
命令可以将当前项目安装到本地仓库,以供其他项目导入作为依赖使用 -
verify
命令可以按顺序执行每个默认生命周期阶段(validate
,compile
,package
等)
Maven测试项目
通过使用test
命令,可以一键测试所有位于test目录下的测试案例,请注意有以下要求:
- 测试类的名称必须是以
Test
结尾,比如MainTest
- 测试方法上必须标注
@Test
注解,实测@RepeatedTest
无效
这是由于JUnit5比较新,我们需要重新配置插件升级到高版本,才能完美的兼容Junit5:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<!-- JUnit 5 requires Surefire version 2.22.0 or higher -->
<version>2.22.0</version>
</plugin>
</plugins>
</build>
现在@RepeatedTest
、@BeforeAll
也能使用了
Maven打包项目
我们的项目在编写完成之后,要么作为Jar依赖,供其他模型使用,要么就作为一个可以执行的程序,在控制台运行,我们只需要直接执行package
命令就可以直接对项目的代码进行打包,生成jar文件。
当然,以上方式仅适用于作为Jar依赖的情况,如果我们需要打包一个可执行文件,那么我不仅需要将自己编写的类打包到Jar中,同时还需要将依赖也一并打包到Jar中,因为我们使用了别人为我们通过的框架,自然也需要运行别人的代码,我们需要使用另一个插件来实现一起打包:
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.test.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
在打包之前也会执行一次test命令,来保证项目能够正常运行,当测试出现问题时,打包将无法完成,我们也可以手动跳过,选择执行Maven目标
来手动执行Maven命令,输入mvn package -Dmaven.test.skip=true
来以跳过测试的方式进行打包。