跳转至

Maven

https://www.liaoxuefeng.com/wiki/1252599548343744/1255945359327200

Java 项目构建和依赖管理工具,可以自动化构建、测试、打包和部署项目

idea、ecplise 等不同工具默认的构建格式要求不同,所以统一选择使用 maven 构建可以基于任何工具开发

mvn -v

项目结构

path/
    project1/
    project2/
    project3/
        ├── pom.xml                  # Maven 配置文件
        ├── src
           ├── main
              ├── java             # Java 源代码目录
                  └── com/example/myapp/    # 开发者代码主目录,主类(入口)Main.java
                          controller
                          service
                          dao
                          model        
              ├── resources        # 存放静态资源、配置文件等
                      log4j.properties
                      spring-mybatis.xml
                      static/
                          css/
                          js/
                          images/
              ├── webapp           # Java Web 标准结构,不能乱改
                  └── WEB-INF
                     └── web.xml
           └── test
               └── java             # 测试源码目录
               └── resources        # 测试资源目录
        ├── target                   # 所有编译、打包生成的文件会放在这里
           ├── classes
              ├── com/example/       # Java 编译后的字节码文件,比如 Main.class
           └── test-classes

依赖管理

主要基于配置文件:pom.xml

依赖包哪里去找?

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <!-- 一个 Maven 工程由以下三个字段唯一标识,即可被其它库引入:groupId:artifactId:version -->
    <!-- com.example:demo:1.0-SNAPSHOT -->
    <groupId>com.example</groupId>  <!-- 最多4级:com.{公司}.业务线.子业务线 -->
    <artifactId>demo</artifactId>  <!-- 单体项目可以随便起,微服务一般格式:产品线名-模块名,通常跟项目名保持一致 -->
    <version>1.0-SNAPSHOT</version>  <!-- 通常3级:主版本号.次版本号.修订号,一般工具会默认配置 -->

    <!-- Packaging 属性指示将项目打包为什么类型的文件,比如 idea 会据此识别 Maven 项目类型 -->
    <packaging>war</packaging>
    <!-- 
        jar 代表普通的 Java 工程,打包后是 .jar 结尾的文件,不写的时候默认就是这个
        war 代表 Java Web 工程,打包以后是 .war 结尾的文件
        pom 代表不会打包,用来做继承的父工程
    -->

    <!-- 固定JDK版本,防止同一个项目的不同的开发者各自使用不同版本的JDK -->
    <properties>
        <maven.compiler.source>17</maven.compiler.source>  <!-- 表示Java编译器读取的源码版本 -->
        <maven.compiler.target>17</maven.compiler.target>  <!-- 表示Java编译器编译的Class版本 -->
        <!-- maven.compiler.release 使用的JDK版本 -->

        <!-- 还可以声明一些自定义变量,然后在其他位置引用:${jackson.version} -->
        <xxx.yy>aaa</xxx.yy>
    </properties>

    <!-- 声明依赖,Maven会自动下载这个依赖包并把它放到classpath中 -->
    <!-- scope 可选属性,限定依赖的作用域
        compile 默认,可在 main, test, 打包和运行时使用
        test 只在 test 中使用
        runtime 只在打包和运行时使用,比如使用反射的时候
        provided main和test中用,运行时不用,比如 servlet
    -->
    <dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <version>2.0.16</version>
        </dependency>

        <dependency>
            ...
        </dependency>
    </dependencies>

    <!-- 导入插件 -->
    <build>
        <plugin>
            ...gav...
        </plugin>
    </build>
</project>

构建

主要分清理、构建、报告三个周期

同一周期中后面的命令会自动触发前面的命令,比如 mvn package 会自动先触发 compiletest

而命令其实是依赖底层的插件来构建的

# 清理周期
mvn clean  # 清理上一次构建的产物,即删除 target 文件

# 构建周期
mvn compile  # 编译项目,生成 target 文件
mvn test  # 执行单元测试
mvn package  # 打包项目,生成 jar 或 war 包
# 部署,必须是 jar 包形式
mvn install  # 本地部署:打包后上传到本地 maven 仓库
mvn deploy  # 私服部署:只打包,上传到 maven 私服仓库

# 报告周期
mvn site  # 生成项目依赖信息的展示页面,没啥用

命令可以连在一起写,所以常用的命令是:

  • 打包:mvn clean package
  • 重新编译:mvn clean compile
  • 本地部署:mvn clean install