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 ​来以跳过测试的方式进行打包。