关于maven的全域理解
1.到底什么是maven
maven是一个概念的名词,每个人对这个概念的理解都不一样。我们从应用场景来认识maven。我们有一套springboot的源码。
中间就有个疑问,这个springboot是如何启动的。如何编译运行的。这个就是maven的机制在起作用。他就是处理源代码,让springboot项目能正常启动,打包的这么一套机制。认识maven就要从springboot这种项目里入手,因为maven就是解决springboot能正常运行的机制。
这里基础的就不说了,比方说,windows电脑如何配置maven,idea如何创建一个mave项目。我们直接深入到springboot的pom配置。一切springboot的构建信息,都在pom里完成。
我们分两个来讲,一个是单独一个模块,也就是一个单体项目。另外一个则是微服务项目,多项目聚合管理。
首先我们来一个标准单体项目构建的pom
xml
```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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- ============ 父项目 ============ -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.1</version>
<relativePath/>
</parent>
<!-- ============ 项目坐标 ============ -->
<groupId>com.ww</groupId>
<artifactId>name</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>boengongye</name>
<description>工业项目</description>
<!-- ============ 属性配置 ============ -->
<properties>
<!-- JDK 版本 -->
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 编码配置 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<!-- 跳过测试 -->
<skipTests>true</skipTests>
<!-- 统一依赖版本管理 -->
<mybatis-plus.version>3.5.2</mybatis-plus.version>
<druid.version>1.2.11</druid.version>
<fastjson.version>1.2.83</fastjson.version>
<hutool.version>5.8.11</hutool.version>
<easyexcel.version>3.1.1</easyexcel.version>
<poi.version>4.1.2</poi.version>
<swagger.version>2.9.2</swagger.version>
<pagehelper.version>1.4.6</pagehelper.version>
<activemq.version>5.16.5</activemq.version>
<dynamic-datasource.version>3.5.2</dynamic-datasource.version>
</properties>
<!-- ============ 多环境配置 ============ -->
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<properties>
<profile.active>dev</profile.active>
<profile.name>开发环境</profile.name>
</properties>
<activation>
<!-- 默认激活开发环境 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<profile.active>test</profile.active>
<profile.name>测试环境</profile.name>
</properties>
</profile>
<!-- 预生产环境 -->
<profile>
<id>uat</id>
<properties>
<profile.active>uat</profile.active>
<profile.name>预生产环境</profile.name>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<profile.active>prod</profile.active>
<profile.name>生产环境</profile.name>
</properties>
</profile>
</profiles>
<!-- ============ 依赖管理 ============ -->
<dependencies>
<!-- ========== Spring Boot 核心依赖 ========== -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- ========== 数据库相关 ========== -->
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<!-- 动态数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>${dynamic-datasource.version}</version>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
</dependency>
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- JPA (如果需要) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- ========== 消息队列 ========== -->
<!-- MQTT -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-integration</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
<!-- ActiveMQ -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>${activemq.version}</version>
</dependency>
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
</dependency>
<!-- ========== 工具类库 ========== -->
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- Hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!-- Guava -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
<!-- FastJSON (统一版本,修复安全漏洞) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- Gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<!-- ========== Apache Commons ========== -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-csv</artifactId>
<version>1.9.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- ========== Office 文档处理 ========== -->
<!-- EasyExcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>${easyexcel.version}</version>
</dependency>
<!-- POI -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<!-- ========== API 文档 ========== -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- ========== HTTP 客户端 ========== -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<!-- ========== XML 处理 ========== -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!-- ========== 加密 ========== -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>
<!-- ========== 模板引擎 ========== -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<!-- ========== SmartBI 相关 (建议迁移到 Maven 私服) ========== -->
<dependency>
<groupId>com.smartbi</groupId>
<artifactId>smartbi-common</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.smartbi</groupId>
<artifactId>smartbi-sdk</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.smartbi</groupId>
<artifactId>smartbi-dao</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.smartbi</groupId>
<artifactId>smartbi-framework</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.smartbi</groupId>
<artifactId>smartbi-freequery</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
<!-- ============ 构建配置 ============ -->
<build>
<!-- 最终打包文件名 -->
<finalName>${project.artifactId}-${project.version}</finalName>
<!-- 资源文件配置 -->
<resources>
<!-- 主资源目录 -->
<resource>
<directory>src/main/resources</directory>
<!-- 开启过滤,支持 ${} 占位符 -->
<filtering>true</filtering>
<includes>
<include>**/*.yml</include>
<include>**/*.yaml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<!-- 静态资源不过滤,防止二进制文件损坏 -->
<resource>
<directory>src/main/resources</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.yml</exclude>
<exclude>**/*.yaml</exclude>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
</resource>
</resources>
<plugins>
<!-- Spring Boot 打包插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.1</version>
<configuration>
<!-- 主启动类 -->
<!-- <mainClass>com.ww.boengongye.Application</mainClass> -->
<!-- 包含系统作用域依赖 -->
<includeSystemScope>true</includeSystemScope>
<!-- 排除不需要打包的依赖 -->
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
<!-- JVM 参数配置 -->
<jvmArguments>
-Xms512m -Xmx1024m
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m
-XX:+UseG1GC
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp/heapdump.hprof
-Dfile.encoding=UTF-8
-Duser.timezone=GMT+08
</jvmArguments>
</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>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<!-- 显示编译警告 -->
<showWarnings>true</showWarnings>
<!-- 显示详细编译信息 -->
<verbose>false</verbose>
<!-- 编译参数 -->
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<!-- 资源插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
<!-- 使用默认分隔符 ${} -->
<useDefaultDelimiters>true</useDefaultDelimiters>
</configuration>
</plugin>
<!-- Surefire 测试插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<!-- 跳过测试 -->
<skipTests>${skipTests}</skipTests>
<!-- 测试失败不影响构建 -->
<testFailureIgnore>true</testFailureIgnore>
<!-- 并行执行测试 -->
<parallel>methods</parallel>
<threadCount>4</threadCount>
<!-- 测试 JVM 参数 -->
<argLine>
-Dfile.encoding=UTF-8
-Xms256m -Xmx512m
</argLine>
</configuration>
</plugin>
<!-- JAR 插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<!-- <mainClass>com.ww.boengongye.Application</mainClass> -->
</manifest>
<manifestEntries>
<!-- 指定编码 -->
<Built-By>${user.name}</Built-By>
<Build-Time>${maven.build.timestamp}</Build-Time>
<Implementation-Version>${project.version}</Implementation-Version>
</manifestEntries>
</archive>
</configuration>
</plugin>
<!-- 源码打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 依赖分析插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.3.0</version>
</plugin>
</plugins>
</build>
</project>
我们简单分析一下这个pom写的思路。
1.首先说明必要的项目信息
2.项目继承springboot项目
3.项目的一些基本构件信息,utf-8,使用的java语言。
4.使用依赖的版本号
5.使用的依赖
6.多环境配置
7.springboot打包插件