一、POM.xml介绍
毫无疑问,Maven 项目的灵魂就是 pom.xml 文件,所以接下来我会详细地对其进行分析。
1、项目基本信息
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>com.yingside</groupId>
<artifactId>forest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>forest Maven Webapp</name>
.......其他省略......
</project>
<project>
是 pom.xml 的根元素,声明了相关的命名空间,其他的标签都是project标签的子标签<modelVersion>
指定了当前项目对象模型(POM)的版本,对于 Maven 3.x 来说,该值只能是 4.0.0。<groupId>
定义了项目的组名,这个组往往和项目所在的组织或公司关联。<artifactId>
定义了当前 Maven 项目在组中唯一的 ID。<version>
定义了项目的版本号,SNAPSHOT 为快照的意思,也就是说该项目还处于开发阶段。<packaging>
定义了项目的打包类型,可选值有 war、jar 等。<name>
定义了项目的名称。
2、变量配置信息
pom.xml 文件的第二部分通常用来配置一些变量信息。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<mybatis.version>3.5.1</mybatis.version>
<spring.version>5.1.5.RELEASE</spring.version>
</properties>
<project.build.sourceEncoding>
定义了编译的编码格式<maven.compiler.source>
与<maven.compiler.target>
定义了推荐的JDK编译版本<mybatis.version>
与<spring.version>
这个是自定义的标签,后面要维护很多jar包的版本,为了便于维护,可以在这里统一指定版本,后面直接使用${mybatis.version}
或者${spring.version}
的形式来调用这些配置项。这样做的好处显而易见,当依赖项的版本升级的时候,可以直接修改变量值即可。
3、依赖管理
阿里云的 Maven 仓库下有各种各样的第三方类库,换句话说就是,只有你想不到的,没有你找不到的。大多数 Maven 项目的依赖项列表都会很长很长,为了便于说明,下面我只列出某些具有特色的。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
(1)、查找合适的Maven依赖jar包
上文中曾提到,<groupId>
、<artifactId>
、<version>
合起来可以准确地定位一个依赖项。
当然每个包相应的maven标签是什么也不用纠结,你可以在maven repository网站中搜索对应的包名就行了 比如你要查找mybatis的包:
由于之前通过IDEA创建项目的之后我们已经选择了自动导入Maven的jar 所以将这段代码复制到pom.xml之后就不需要我们再干什么事情,IDEA会自动将jar包引入
(2)、<exclusions>
主要用于排除依赖。
有时候,我们引入的依赖中可能会包含一些不想要的依赖包,我们想引入自己想要的,这时候就要用到排除依赖了。
使用 <exclusion>
的时候只需要指定 groupId
和 artifactId
就行了,并不需要 version
,这是因为 groupId
和 artifactId
就可以定位某种类型的依赖。
(3)、<scope>
用来控制依赖的范围。
test:测试依赖范围。典型的例子是 Jnuit,它只有在编译测试代码及运行测试的时候才需要。
compile:编译依赖范围(其实不止是编译,对测试、运行同样有效),缺省项,如果没有指定,就会默认使用该依赖范围。
provided:提供依赖范围。对编译和测试有效,但在运行时候无效。
runtime:运行时依赖范围。对测试和运行有效,但在编译时无效。
注意:如果不知道选哪一种,缺省就对了。
4、构建配置
<build>
元素中包含了执行 Maven 构建周期目标所需的插件以及相关的配置。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<finalName>forest</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<!--跳过junit Test测试文件打包-->
<configuration>
<skip>true</skip>
</configuration>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
<finalName>
,打成 jar 包或者 war 包时的名称。上文中曾提到,项目打包后的输出目录为${basedir}/target
。<plugins>
用于指定项目在构建过程中使用的插件。一般这些插件在IDEA项目都自动帮你下载配置好了,图形化显示如下面这样:
唯一注意的是,maven-surefire-plugin
是一个测试运行插件,如果想再Maven打包的时候不希望将测试打包,就可以像我上面的代码一样,在maven-surefire-plugin
插件中加上<configuration>
标签
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<!--跳过junit Test测试文件打包-->
<configuration>
<skip>true</skip>
</configuration>
<version>2.22.1</version>
</plugin>
<resources>
描述了各个资源在 Maven 项目中的具体路径。 注意,由于我们已经指定了${basedir}/src/main/java
存放 Java 源代码,但是比如我们一般写mybatis的mapper.xml文件的时候,又习惯写在src下面的包中,这样好与接口对应,但是这么做会让IDEA在编译的时候找不到mapper.xml的配置文件,因此,下面的这段代码是我们经常加上去的:<resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.xml</include> </includes> </resource> </resources>
二、使用Maven命令对项目进行清理、编译、测试、打包
首先这些命令在IDEA上已经被集成了,要使用的话很简单,用鼠标点击两下就行了
下面的介绍主要是为了让大家认识每个命令的作用。
比如现在已经有了一个forest项目
1、清理: mvn clean
该命令会删除 target
目录。可以直接在命令行中执行该命令,只需要切换到项目所在的路径下即可。
2、编译:mvn complie
3、测试:mvn test
test 命令在运行时,会执行 compile 命令;而之前我们已经执行过一次 compile 命令,为了确保结果的准确性,可以执行 mvn clean test 命令确保测试之前没有残余物,结果如下图所示。
Maven 会通过 Surefire 插件,使用 pom.xml 文件中的测试提供者(通常是 Junit)运行测试。执行 test 命令不仅会运行测试,还会产生报告文件,此时 target 目录下的截图如下:
4、打包:mvn install
该命令会按照 pom.xml 文件中 <packaging>
指定的方式,对编译结果打包。同时,还会把打包好的文件放到本地的 Maven 仓库中,以便其他项目把它当做依赖项使用。命令执行结果如下图所示。
查看本地的 Maven 仓库,可以看到刚刚打包好的文件。
Comments