常见标签解释:
<?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>marchsoft</groupId>
<!--项目名-->
<artifactId>smpe-admin</artifactId>
<!--打包方式-->
<packaging>pom</packaging>
<!--版本-->
<version>1.0.0-RELEASE</version>
<!--用来管理同个项目中的各个模块-->
<modules>
<module>smpe-common</module>
<module>smpe-system</module>
<module>smpe-log</module>
</modules>
<!--项目名称,Maven产生的文档用-->
<name>SMPE-ADMIN 后台管理</name>
<!--项目的描述,Maven产生的文档用-->
<description>SMPE是一个基于EL-ADMIN、Spring Boot 2.1.0、JDK1.8+ 、 Mybatis Plus、JWT + Spring
Security、Redis、Vue的前后端分离的后台管理系统
</description>
<!--url标签对项目而言没啥用,此处是github地址-->
<url>https://github.com/sanyueruanjian/smpe-admin</url>
<!--父级项目-->
<parent>
<!--子模块中填写的是父模块的groupId-->
<groupId>org.springframework.boot</groupId>
<!--子模块中填写的是父模块的artifactId-->
<artifactId>spring-boot-starter-parent</artifactId>
<!--子模块中填写的是父模块的version-->
<version>2.1.0.RELEASE</version>
</parent>
<!--属性设置(此处的写法便于全局统一管理)-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<mysql.version>5.1.48</mysql.version>
<lombok.version>1.18.8</lombok.version>
<log4jdbc.version>1.16</log4jdbc.version>
<mybatis.plus.version>3.4.1</mybatis.plus.version>
<swagger.version>2.9.2</swagger.version>
<swagger.models.version>1.5.21</swagger.models.version>
<swagger.annotations.version>1.5.21</swagger.annotations.version>
<druid.version>1.1.22</druid.version>
<mapstruct.version>1.3.1.Final</mapstruct.version>
<hutool.version>5.5.0</hutool.version>
<jjwt.version>0.11.1</jjwt.version>
<UserAgentUtils.version>1.20</UserAgentUtils.version>
<ip2region.version>1.7.2</ip2region.version>
<captcha.version>1.6.2</captcha.version>
<freemarker.version>2.3.30</freemarker.version>
<poi.version>3.17</poi.version>
<xercesImpl.version>2.12.0</xercesImpl.version>
<aspectjrt.version>1.9.5</aspectjrt.version>
<fastjson.version>1.2.70</fastjson.version>
<knife4j.version>2.0.4</knife4j.version>
<inject.version>1</inject.version>
</properties>
<!-- 锁定jar包版本 -->
<dependencyManagement>
<!--依赖管理-->
<dependencies>
<!-- hutool的java开发工具包 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<!--读取properties标签中的版本号-->
<version>${hutool.version}</version>
</dependency>
<!--lombok插件-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!--Mysql依赖包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- druid数据源驱动 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<!--Swagger异常:AbstractSerializableParameter : Illegal DefaultValue null for parameter type integer
由于实体类使用@ApiModelProperty时,example属性没有赋值导致的,会进行非空判断
解决: 排除后,上传更高版本
-->
<!--exclusions标签用于排除关联依赖的引入,因为maven的pom依赖其中有一点是将关联的依赖
全都引入进来 ,这个标签在这的作用就是,如果关联的依赖和引入的其他依赖可能存在冲突,就必
须将关联的依赖排除掉,所以就用这个标签
-->
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger.annotations.version}</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger.models.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!-- swagger end -->
<!-- Knife4j -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- swagger end -->
<!--监控sql日志-->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
<version>${log4jdbc.version}</version>
</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>
<!-- mybatis plus 代码生成模板引擎 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>${freemarker.version}</version>
</dependency>
<!-- mybatis plus end -->
<!--jwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
</dependency>
<!--Java 实体映射工具 —— mapStruct依赖-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<!-- 获取客户端浏览器类型、客户端操作系统、ip地址等信息 -->
<dependency>
<groupId>eu.bitwalker</groupId>
<artifactId>UserAgentUtils</artifactId>
<version>${UserAgentUtils.version}</version>
</dependency>
<!-- 获取ip的详细地址 -->
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>${ip2region.version}</version>
</dependency>
<!-- 后端图形验证 -->
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>${captcha.version}</version>
</dependency>
<!-- excel工具 -->
<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>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>${xercesImpl.version}</version>
</dependency>
<!-- AOP面向切面编程框架 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectjrt.version}</version>
</dependency>
<!-- Java依赖注入标准 -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>${inject.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--配置maven项目的远程仓库-->
<repositories>
<repository>
<!--远程仓库唯一标识符 -->
<id>public</id>
<!--描述 -->
<name>aliyun nexus</name>
<!--远程仓库url -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<!--配置Maven从什么地方下载插件构件-->
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<!-- 打包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 跳过单元测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
分析个框架中的pom
问题1:
核心模块中的pom已经继承公共模块,当它再去继承日志模块(日志模块也继承了公共模块)。此时不是引入两次了吗?或者说日志模块的pom引入的还有其他模块的pom,而此时并不希望引入多余依赖,该怎么办?
当project-A 依赖project-B, project-B 依赖project-D时。如果我们不希望将project-D及其依赖项添加到项目A的类路径中怎么办?因为我们知道存储库中缺少某些Project-D的依赖项(例如Project-E),并且您不需要该功能在Project-B中仍然依赖于Project-D。在这种情况下,Project-B的开发人员可以提供对Project-D的依赖,该依赖为<optional> true </ optional>
,如下所示:
<dependency>
<groupId>sample.ProjectD</groupId>
<artifactId>ProjectD</artifactId>
<version>1.0-SNAPSHOT</version>
<optional>true</optional>
</dependency>
问题2:
依赖版本锁定是怎么回事?
jar包锁定仅仅是对依赖的版本进行锁定,通过<dependencyManagement>
标签包裹在</dependencies>
标签外面。需要注意的是,锁定不代表引入,这仅仅是对依赖版本的一个局限,需要单独的再去引入。注意:Springboot相关的不需要锁
问题3:
Maven下载配置问题
问题4:
scope作用域问题
例如:公共模块(子模块)中引入如下依赖,此时就不得不注释掉<scope>test</scope>
,否则在其他子模块引入公共模块时下面的依赖就会被忽略。但是一旦注释掉scope,虽然解决了被忽略的问题,但是会把这个本不必打包的依赖给打包进去。因此最好的解决方案是把下面的依赖放在父工程的pom中去。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<!--<scope>test</scope>-->
</dependency>