Maven 构建应用
对于各位 Java 开发者来说 Maven 这个工具都不陌生,本文旨在整理一下 Maven 中一些常用知识点和使用技巧。
版本说明:
Maven:3.8.1
Idea:2022.1.4
Maven 构建单模块应用
文件目录
普通的Maven构建的Java项目,它的基本目录结构如下:
maven-project
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
│ ├── java
│ └── resources
└── target
- maven-project:是项目的根目录名;
- pom.xml:maven 项目的配置文件,定义项目依赖、插件、版本等信息(这个文件比较重要,后面会进一步介绍);
- src/main/java:此目录存放项目源代码(java项目中这个目录名就是java,如果是kotlin项目或者其他项目就不一样了);
- src/main/resources:此目录存放非代码资源文件,如:一些配置文件(xxx.yml),资源文件(html、js、图片)等;
- src/test/java:放测试代码;
- src/test/resources:放测试用的资源文件;
- target:这是 maven 自动生成的编译、测试、打包输出目录;
pom.xml 文件
pom.xml 文件是 maven 项目的核心,他几乎包含了一个 maven 项目的所有信息。
我们通过一个简单的模板来看一下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 这里的 xmlns xmlns xsi:schemaLocation 不用太关心,正常情况下工作中用不到(一般都是别人配置好的),感兴趣的可以搜一下 -->
<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">
<!-- 这个一般都是 4.0.0 ,指定了 POM 文件的格式版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 组织id,类似于Java的包名,通常是公司或组织名称或者域名倒写。 -->
<groupId>com.chenghd</groupId>
<!-- 类似于Java的类名,通常是项目名称。 -->
<artifactId>maven-project</artifactId>
<!-- 版本,这个版本的写法有很多规范,不同的公司有不同的要求。 -->
<version>1.0</version>
<!-- packaging 的作用有几个: -->
<!-- 1、指定项目最终生成的文件类型,如 jar、war、ear、pom 等(默认是jar)。-->
<!-- 2、maven 根据配置不同的 packaging 值调用不同的插件来构建项目-->
<!-- 3、在多模块中项目,父模块通常设置成 pom,这种类型项目不会产生任何实际的可执行代码或库,而是用来定义一组共享的配置、依赖关系和插件设置。它的子模块会继承这些配置。-->
<packaging>jar</packaging>
<properties>
<!-- 这个用来显式指定项目中源文件(如 .java、.kt、.properties 等)的字符编码格式。 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 指定源代码的语法版本和目标字节码的版本,需要 maven-compiler-plugin 版本高一点,支持这个标签 -->
<maven.compiler.release>17</maven.compiler.release>
<!-- 在jdk8之后的版本可用上面的替换下面这两个 -->
<!--<maven.compiler.source>8</maven.compiler.source>-->
<!--<maven.compiler.target>8</maven.compiler.target>-->
</properties>
<!-- 依赖的其他项目 -->
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.16</version>
</dependency>
</dependencies>
</project>
在 maven 中,是靠 groupId、artifactId 和 version 这三个属性来确定项目的唯一性的(其实这个三个属性看字面意思就知道作用是什么了)。
pom.xml 依赖
在 pom.xml 中比较常用的就是处理项目的依赖问题。比如,我们写 dao 层的时候需要用到 mybatis、mysql-jdbc 等项目中的代码,这时候就可以把这些项目以配置文件的方式加到 pom.xml 文件中,这样 maven 就会帮我们自动下载相关源码,并导入到我们的项目中。
看一个简单的依赖配置例子:
<project ...>
...
<dependencies>
<!-- 这里依赖(引用)了一个项目 -->
<dependency>
<!-- 组织 id,类似公司名 -->
<groupId>org.junit.jupiter</groupId>
<!-- 项目名,类似部门名 -->
<artifactId>junit-jupiter-api</artifactId>
<!-- 版本 -->
<version>5.3.2</version>
<!-- 依赖范围,很多情况下,我们会省略这个配置,默认是 compile -->
<scope>test</scope>
</dependency>
</dependencies>
...
</project>
scope 定义了包的依赖的范围,也就是什么时候会用到这个jar包的内容,这个配置的值有:compile、test、runtime 和 provided 这几种。
scope | 说明 |
---|---|
compile | 编译时需要用到该jar包(默认)。 |
test | 编译 Test 时需要用到该jar包(也就是在 test 文件夹下用到的),这个依赖最终不会被打包到项目中,scope 为 test 也无法传递依赖。 |
runtime | 编译时不需要,但运行时需要用到。如JDBC驱动等。 |
provided | 编译时需要用到,但运行时由JDK或某个服务器提供。如Servlet API等。 |
mvnw
一般工作中我们用 idea 之类的开发工具构建的 maven 项目会多出来几个文件,如下:
maven-project
├── ...
├── .mvn
│ ├── wrapper
│ │ └── maven-wrapper.properties
├── mvnw
└── mvnw.cmd
PS:当然还有一些 .idea、.iml、.gitignore 这些和 mavan 项目不是直接相关的文件就不做介绍了。
- mvnw:全名是 maven wrapper ,他会根据 maven-wrapper.properties 文件中的配置自动下载项目所需的 Maven 版本。这样就确保了所有开发人员都会用同一个 maven 版本开发项目。他其实就用用来替代 mvn 命令的(后面会讲)。
- mvnw:mvnw文件适用于Linux(bash),mvnw.cmd适用于Windows 环境。
- maven-wrapper.properties:记录了项目所需的 Maven 版本等信息。
mvn
在实际开发过程中,虽然用开发工具点点点就可以,但是稍微了解下常用的 mvn 命令也是有必要的。
经常使用的命令有:
# 清理所有生成的class和jar;
mvn clean
# 先清理,再执行到compile;
mvn clean compile
# 先清理,再执行到test,因为执行test前必须执行 compile,所以这里不必指定compile;
mvn clean test
# 先清理,再执行到package。
mvn clean package
Maven 构建多模块应用
很多时候我们的项目都是多模块的,这样可以在不同的模块中写不同的逻辑,分工更明确点。我们下面用一个 springboot 的项目来做演示。
文件目录
它的基本目录结构如下,在一个 maven-multi-project 项目中有三个模块 module-a、module-b、module-c:
maven-multi-project
├── pom.xml
├── module-a
│ ├── pom.xml
│ └── src
├── module-b
│ ├── pom.xml
│ └── src
└── module-c
├── pom.xml
└── src
pom.xml 文件
我们简单看一下多模块可以怎么配置来统一管理版本:
maven-multi-project/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>
<groupId>com.chenghd</groupId>
<artifactId>maven-multi-project</artifactId>
<!-- 这里是 pom 哈,上面讲过了 -->
<packaging>pom</packaging>
<version>${revision}</version>
<modules>
<module>module-a</module>
<module>module-b</module>
<module>module-c</module>
</modules>
<properties>
<!-- 整个项目版本,这里对多个模块做统一管理,保证所有模块中互相依赖不会出问题 -->
<revision>0.1.0</revision>
<!-- 源代码版本和编译目标的字节码版本 -->
<!-- 可以用 <maven.compiler.release>17</maven.compiler.release> 代替-->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<!-- 其他依赖包版本统一管理 -->
<!-- 要求所有子模块要是用到 springboot 都使用同一个版本,避免版本冲突等问题 -->
<version.springboot>3.1.12</version.springboot>
<version.spring>6.0.21</version.spring>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>compile</scope>
</dependency>
</dependencies>
<!-- 配置阿里镜像,可以加快下载 jar 包速度,当然你也可以在 settings.xml 文件里全局配置,那样就不用每个项目都配置了 -->
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<layout>default</layout>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
</repository>
</repositories>
</project>
maven-multi-project/module-a/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>
<artifactId>module-a</artifactId>
<parent>
<artifactId>maven-multi-project</artifactId>
<groupId>com.chenghd</groupId>
<!--在 maven-multi-project/pom.xml 的 properties 中配置的 -->
<version>${revision}</version>
</parent>
<dependencies>
<!-- 依赖 spring 相关内容 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<!--在 maven-multi-project/pom.xml 的 properties 中配置的 -->
<version>${version.spring}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<!--在 maven-multi-project/pom.xml 的 properties 中配置的 -->
<version>${version.spring}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<!--在 maven-multi-project/pom.xml 的 properties 中配置的 -->
<version>${version.spring}</version>
</dependency>
</dependencies>
</project>
maven-multi-project/module-b/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>
<artifactId>module-b</artifactId>
<parent>
<artifactId>maven-multi-project</artifactId>
<groupId>com.chenghd</groupId>
<!--在 maven-multi-project/pom.xml 的 properties 中配置的 -->
<version>${revision}</version>
</parent>
<dependencies>
<!-- 依赖的 springboot 的相关内容-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${version.springboot}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${version.springboot}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<!-- 格式化最后打包的jar包名 -->
<!-- 这里打包会生成:maven-module-b-0.1.0.jar -->
<finalName>maven-${artifactId}-${revision}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<!-- springboot项目启动入口类位置 -->
<mainClass>com.chenghd.Application</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
module-c 也差不多,省略了。
参考
Maven介绍,廖雪峰的官方网站。
Maven官网,Maven的官方网站。
来源链接:https://www.cnblogs.com/chenghd/p/18703520
没有回复内容