07月12, 2019

Maven 入门(下)-- POM.xml介绍与常用命令

一、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的包: -w946 -w741 -w709 -w725

由于之前通过IDEA创建项目的之后我们已经选择了自动导入Maven的jar -w304 所以将这段代码复制到pom.xml之后就不需要我们再干什么事情,IDEA会自动将jar包引入

(2)、<exclusions> 主要用于排除依赖。

有时候,我们引入的依赖中可能会包含一些不想要的依赖包,我们想引入自己想要的,这时候就要用到排除依赖了。

使用 <exclusion> 的时候只需要指定 groupIdartifactId 就行了,并不需要 version,这是因为 groupIdartifactId 就可以定位某种类型的依赖。

(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项目都自动帮你下载配置好了,图形化显示如下面这样: -w531

唯一注意的是,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上已经被集成了,要使用的话很简单,用鼠标点击两下就行了 -w530

下面的介绍主要是为了让大家认识每个命令的作用。

比如现在已经有了一个forest项目

1、清理: mvn clean

该命令会删除 target 目录。可以直接在命令行中执行该命令,只需要切换到项目所在的路径下即可。 -w639

2、编译:mvn complie

-w640

3、测试:mvn test

test 命令在运行时,会执行 compile 命令;而之前我们已经执行过一次 compile 命令,为了确保结果的准确性,可以执行 mvn clean test 命令确保测试之前没有残余物,结果如下图所示。

-w739

Maven 会通过 Surefire 插件,使用 pom.xml 文件中的测试提供者(通常是 Junit)运行测试。执行 test 命令不仅会运行测试,还会产生报告文件,此时 target 目录下的截图如下: -w580

4、打包:mvn install

该命令会按照 pom.xml 文件中 <packaging> 指定的方式,对编译结果打包。同时,还会把打包好的文件放到本地的 Maven 仓库中,以便其他项目把它当做依赖项使用。命令执行结果如下图所示。 -w799

查看本地的 Maven 仓库,可以看到刚刚打包好的文件。

-w742

本文链接:http://www.yanhongzhi.com/post/maven-2.html

-- EOF --

Comments