找回密码
 立即注册
首页 业界区 安全 使用 Maven 构建的项目

使用 Maven 构建的项目

哎禹供 2025-6-1 20:26:56
Maven 构建应用

对于各位 Java 开发者来说 Maven 这个工具都不陌生,本文旨在整理一下 Maven 中一些常用知识点和使用技巧。
版本说明:
Maven:3.8.1
Idea:2022.1.4
Maven 构建单模块应用

文件目录

普通的Maven构建的Java项目,它的基本目录结构如下:
  1. maven-project
  2. ├── pom.xml
  3. ├── src
  4. │   ├── main
  5. │   │   ├── java
  6. │   │   └── resources
  7. │   └── test
  8. │       ├── java
  9. │       └── resources
  10. └── 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 项目的所有信息。
我们通过一个简单的模板来看一下:
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4.    
  5.         <modelVersion>4.0.0</modelVersion>
  6.    
  7.    
  8.         <groupId>com.chenghd</groupId>
  9.        
  10.     maven-project</artifactId>
  11.    
  12.         <version>1.0</version>
  13.    
  14.    
  15.    
  16.    
  17.         <packaging>jar</packaging>
  18.        
  19.     <properties>
  20.         
  21.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  22.         
  23.                 <maven.compiler.release>17</maven.compiler.release>
  24.         
  25.         
  26.         
  27.         </properties>
  28.    
  29.         <dependencies>
  30.         <dependency>
  31.             <groupId>org.slf4j</groupId>
  32.             slf4j-simple</artifactId>
  33.             <version>2.0.16</version>
  34.         </dependency>
  35.         </dependencies>
  36. </project>
复制代码
在 maven 中,是靠 groupId、artifactId 和 version 这三个属性来确定项目的唯一性的(其实这个三个属性看字面意思就知道作用是什么了)。
pom.xml 依赖

在 pom.xml 中比较常用的就是处理项目的依赖问题。比如,我们写 dao 层的时候需要用到 mybatis、mysql-jdbc 等项目中的代码,这时候就可以把这些项目以配置文件的方式加到 pom.xml 文件中,这样 maven 就会帮我们自动下载相关源码,并导入到我们的项目中。
看一个简单的依赖配置例子:
  1. <project ...>
  2. ...
  3.         <dependencies>
  4.       
  5.        <dependency>
  6.          
  7.           <groupId>org.junit.jupiter</groupId>
  8.          
  9.           junit-jupiter-api</artifactId>
  10.          
  11.           <version>5.3.2</version>
  12.          
  13.           <scope>test</scope>
  14.       </dependency>
  15.         </dependencies>
  16. ...
  17. </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 项目会多出来几个文件,如下:
  1. maven-project
  2. ├── ...
  3. ├── .mvn
  4. │   ├── wrapper
  5. │   │   └── maven-wrapper.properties
  6. ├── mvnw
  7. └── 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 命令也是有必要的。
经常使用的命令有:
  1. # 清理所有生成的class和jar;
  2. mvn clean
  3. # 先清理,再执行到compile;
  4. mvn clean compile
  5. # 先清理,再执行到test,因为执行test前必须执行 compile,所以这里不必指定compile;
  6. mvn clean test
  7. # 先清理,再执行到package。
  8. mvn clean package
复制代码
Maven 构建多模块应用

很多时候我们的项目都是多模块的,这样可以在不同的模块中写不同的逻辑,分工更明确点。我们下面用一个 springboot 的项目来做演示。
文件目录

它的基本目录结构如下,在一个 maven-multi-project 项目中有三个模块 module-a、module-b、module-c:
  1. maven-multi-project
  2. ├── pom.xml
  3. ├── module-a
  4. │   ├── pom.xml
  5. │   └── src
  6. ├── module-b
  7. │   ├── pom.xml
  8. │   └── src
  9. └── module-c
  10.     ├── pom.xml
  11.     └── src
复制代码
pom.xml 文件

我们简单看一下多模块可以怎么配置来统一管理版本:
maven-multi-project/pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>com.chenghd</groupId>
  7.     maven-multi-project</artifactId>
  8.    
  9.     <packaging>pom</packaging>
  10.     <version>${revision}</version>
  11.     <modules>
  12.         <module>module-a</module>
  13.         <module>module-b</module>
  14.         <module>module-c</module>
  15.     </modules>
  16.     <properties>
  17.         
  18.         <revision>0.1.0</revision>
  19.         
  20.         
  21.         <maven.compiler.source>17</maven.compiler.source>
  22.         <maven.compiler.target>17</maven.compiler.target>
  23.         
  24.         
  25.         <version.springboot>3.1.12</version.springboot>
  26.         <version.spring>6.0.21</version.spring>
  27.     </properties>
  28.     <dependencies>
  29.         <dependency>
  30.             <groupId>org.projectlombok</groupId>
  31.             lombok</artifactId>
  32.             <version>1.18.22</version>
  33.             <scope>compile</scope>
  34.         </dependency>
  35.     </dependencies>
  36.    
  37.    
  38.     <repositories>
  39.         <repository>
  40.             <id>aliyun</id>
  41.             <name>aliyun</name>
  42.             <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  43.             <layout>default</layout>
  44.             <releases>
  45.                 <enabled>true</enabled>
  46.                 <updatePolicy>never</updatePolicy>
  47.             </releases>
  48.             <snapshots>
  49.                 <enabled>true</enabled>
  50.                 <updatePolicy>never</updatePolicy>
  51.             </snapshots>
  52.         </repository>
  53.     </repositories>
  54. </project>
复制代码
maven-multi-project/module-a/pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     module-a</artifactId>
  7.     <parent>
  8.         maven-multi-project</artifactId>
  9.         <groupId>com.chenghd</groupId>
  10.         
  11.         <version>${revision}</version>
  12.     </parent>
  13.     <dependencies>
  14.         
  15.         <dependency>
  16.             <groupId>org.springframework</groupId>
  17.             spring-core</artifactId>
  18.             
  19.             <version>${version.spring}</version>
  20.         </dependency>
  21.         <dependency>
  22.             <groupId>org.springframework</groupId>
  23.             spring-beans</artifactId>
  24.             
  25.             <version>${version.spring}</version>
  26.         </dependency>
  27.         <dependency>
  28.             <groupId>org.springframework</groupId>
  29.             spring-context</artifactId>
  30.             
  31.             <version>${version.spring}</version>
  32.         </dependency>
  33.     </dependencies>
  34. </project>
复制代码
maven-multi-project/module-b/pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     module-b</artifactId>
  7.     <parent>
  8.         maven-multi-project</artifactId>
  9.         <groupId>com.chenghd</groupId>
  10.         
  11.         <version>${revision}</version>
  12.     </parent>
  13.     <dependencies>
  14.         
  15.         <dependency>
  16.             <groupId>org.springframework.boot</groupId>
  17.             spring-boot-starter-web</artifactId>
  18.             <version>${version.springboot}</version>
  19.         </dependency>
  20.         <dependency>
  21.             <groupId>org.springframework.boot</groupId>
  22.             spring-boot-starter-test</artifactId>
  23.             <version>${version.springboot}</version>
  24.             <scope>test</scope>
  25.         </dependency>
  26.     </dependencies>
  27.     <build>
  28.         
  29.         
  30.         <finalName>maven-${artifactId}-${revision}</finalName>
  31.         <plugins>
  32.             <plugin>
  33.                 <groupId>org.springframework.boot</groupId>
  34.                 spring-boot-maven-plugin</artifactId>
  35.                 <configuration>
  36.                     <executable>true</executable>
  37.                     
  38.                     <mainClass>com.chenghd.Application</mainClass>
  39.                 </configuration>
  40.                 <executions>
  41.                     <execution>
  42.                         <goals>
  43.                             <goal>repackage</goal>
  44.                         </goals>
  45.                     </execution>
  46.                 </executions>
  47.             </plugin>
  48.             <plugin>
  49.                 <groupId>org.apache.maven.plugins</groupId>
  50.                 maven-compiler-plugin</artifactId>
  51.                 <version>3.8.1</version>
  52.                 <configuration>
  53.                     <source>17</source>
  54.                     <target>17</target>
  55.                     <encoding>UTF-8</encoding>
  56.                 </configuration>
  57.             </plugin>
  58.         </plugins>
  59.     </build>
  60. </project>
复制代码
module-c 也差不多,省略了。
参考

Maven介绍,廖雪峰的官方网站。
Maven官网,Maven的官方网站。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册