Maven的setting.xml和pom.xml的常用配置
Maven是什么:
Maven官方的定义是:Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.
翻译一下:Apache Maven是一个软件项目管理和理解工具。 基于项目对象模型(POM)的概念,Maven可以从*信息管理项目的构建,报告和文档。
Maven是java开发的,对于java来说万物皆对象,同样我们的项目也是对象,maven通过pom.xml文件来定义和配置一个项目,然后通过解析这个pom文件来构建和管理我们的项目,maven和springboot一样同样遵循约定大于配置的理念,给我们做了很多默认的配置和管理。
Maven的setting.xml和pom.xml:
setting.xml
setting.xml是maven在当前安装的物理机上的一个全局的配置,作为java开发一般主要关注的部分就两个地方:
**localRepository**:就是配置自己当前开发的这个机器的jar包放在哪里,也就是我们通常所说的本地仓库
**mirrors**:镜像列表,当我们本地仓库的jar包不支持我们当前工程的构建和运行时,这时候maven就会通过镜像列表中配置的镜像去下载我们所需要的jar包
当然如果我们作为公司的架构师或者研发主管,可能我们需要创建当前公司的一个私有的maven仓库这时候我们就需要关注:
**servers**:认证配置,maven配置账号、密码、分组,权限,可访问文件目录的地方
**proxies**:Http代理配置,当私有仓库没有我们需要的jar包了,就会通过代理来访问外部的maven仓库来下载jar包
当然如果我们需要更加深入的了解所有的setting配置,我们可以查阅对应版本的maven官方的信息,我使用的maven版本是3.6.0,地址为:
https://maven.apache.org/ref/3.6.0/maven-settings/settings.html
以下是maven中默认下的setting.xml文件的一些配置的注解
<?xml version="1.0" encoding="UTF-8"?>
<!-- maven的xml配置文件遵循的规范,很多框架或者工程将xml文件作为配置文件时,都会有自己的规范,你的配置必须按照这个规范来,后续该框架或者工程在工作时解析配置文件时也会按照这个规范去解析 -->
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- 本地仓库,即你安装的maven的物理机器的磁盘上的地址,maven下载的jar就会存放在这里,项目构建的jar包就是从这里取的 -->
<localRepository>G:\mvn_localRepository</localRepository>
<!-- maven全局的插件组,一般很少在这里配置,都是在工程的xml文件的plugins中配置,比如我们的springboot的打包插件spring-boot-maven-plugin -->
<pluginGroups>
</pluginGroups>
<!-- HTTP代理设置的地方,一般将某个本地maven作为一个团队的私服时,需要配置这个代理,当私服也找不到的jar文件就会通过这个代理去访问外网下载我们所需要的jar包 -->
<proxies>
</proxies>
<!-- 认证配置,当我们将某台物理机上的maven作为私服或者有权限的镜像时,需要配置权限分组和分组下的用户名和密码的时候,就是在这里配置的 -->
<servers>
</servers>
<!-- 镜像列表,也就是我们下载jar包文件的地方 -->
<mirrors>
<!-- 具体镜像 -->
<mirror>
<!-- 镜像Id,作为镜像的唯一标识,不可重复 -->
<id>alimaven</id>
<!-- 镜像名称,安装你自己的喜好设置就好了 -->
<name>aliyun maven</name>
<!-- 镜像的地址,也就是我们下载jar包访问的地方了 -->
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<!-- 全局配置信息组,一般也不建议在全局这里配置,都是在具体的maven工程中的pom文件去配置的 -->
<profiles>
<!-- 配置信息 -->
<profile>
<!-- 具体的一个配置信息的唯一标识 -->
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<!-- 当前生效的配置信息,一般也不会在全局配置中配置 -->
<activeProfiles/>
</settings>
pom.xml
作为java开发比较关注而又不太清晰的地方:
modelVersion POM文件模型的版本,来源于当前物理机上安装的maven的超级POM的版本,工程下的pom.xml中我们没有配置的属性都是取这个超级pom文件中的值,这个超级文件在maven的安装目录的lib文件夹下的maven-model-builder-3.6.0.jar中
超级pom文件中跟我们平时工作相关性比较高的地方:
具体的还有些啥,你们可以去自己的maven目录下去找到这个文件去看
scope:当前依赖的作用范围,默认为:compile,其他选择:runtime, test, system, provided,分别作用是啥,官方介绍如下:
官方地址:
https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
maven3.6.0的pom文件的官方配置信息的地址:
https://maven.apache.org/ref/3.6.0/maven-model/maven.html
<?xml version="1.0" encoding="UTF-8"?>
<!-- maven工程的POM文件遵循的xml规范 -->
<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">
<!-- POM文件模型的版本,来源于当前物理机上安装的maven的超级POM的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 子工程声明父工程的信息 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 当前项目的信息 -->
<!-- 当前工程的公司或者组织的域名倒置+项目或者计划名,当然也可以是虚拟的,大公司的比如spring就是按照这个规则来的 -->
<groupId>com.example</groupId>
<!-- 模块名 -->
<artifactId>demo</artifactId>
<!-- 版本号 -->
<version>0.0.1-SNAPSHOT</version>
<!-- 项目名字 -->
<name>demo</name>
<!-- 项目描述 -->
<description>Demo project for Spring Boot</description>
<!-- 当前工程的统一依赖的版本管理 -->
<properties>
<java.version>1.8</java.version>
</properties>
<!-- maven工程依赖的jar包,会去本地仓库找有没有具体jar包的,没有会去配置的仓库中下载我们需要的jar包 -->
<dependencies>
<!-- 具体的依赖 -->
<dependency>
<!-- 当前依赖的组件的 -->
<!-- 当前工程的公司或者组织的域名倒置+项目或者计划名,当然也可以是虚拟的,大公司的比如spring就是按照这个规则来的 -->
<groupId>org.springframework.boot</groupId>
<!-- 当前依赖的模块名称 -->
<artifactId>spring-boot-starter-test</artifactId>
<!-- 当前依赖的模块的版本号 -->
<version></version>
<!-- 当前依赖的作用范围,默认为:compile,其他选择:runtime, test, system, provided -->
<scope>test</scope>
<!-- 配置要排除不引入的jar,每个依赖模块下有很多的jar包,当前工程的其他依赖中可能也引入了这个jar包,但是版本不同,可能这两个jar会有冲突,就可以在其中一个依赖中指定要排除的jar -->
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- maven工程构建配置 -->
<build>
<!-- 当前工程构建使用的插件 -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!-- 聚合配置,比如微服务需要有各个组件和各个服务,我想在外面再给个文件夹,声明这一整个大的工程是干啥的,这时候就会用到聚合了 -->
<!-- 聚合配置,再比如我一个模块也比较复杂,我需要拆分成多个工程,这个模块也需要聚合,这时候这个配置就生效了,配置了聚合,打包时会自动将引用的其他工程也打成jar包放入到lib目录下 -->
<modules>
<!-- 聚合所拥有的具体模块 -->
<module></module>
</modules>
<!-- 环境管理 -->
<issueManagement>
</issueManagement>
<!-- 依赖管理的配置,比如我有一个父工程,父工程下的各个子工程具有相同的依赖引入,这时候我可以在这里做统一的依赖版本配置管理,引入统一的版本的相同依赖,当然具体生效的依赖还是下面
各个子工程自己的POM文件中的依赖,只是这个地方如果指定了依赖的版本,那么子工程没有给定版本的话,就会用这个地方的版本号作为子工程引入的依赖的版本号 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId></groupId>
<artifactId></artifactId>
</dependency>
</dependencies>
</dependencyManagement>
</project>
Maven的使用:
maven创建项目,maven创建项目类似于前端vue项目的脚手架,我们常用的类型有两种:
maven-archetype-quickstart
maven-archetype-webapp
当然maven创建项目的方式也有两种,一种是在你想要创建项目的目录下执行maven的命令:
mvn -B archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4
另外一种就在开发工具如idea、eclipse下
**maven项目的目录结构:**
**pom**:pom是我们maven对于整个工程的一个定义和配置的文件,maven就是通过这个文件来构建和管理我们项目的
**src**:src下存放的是我们的代码和一些配置文件,以及资源文件,mian下面是源代码相关的,test下是测试相关的
**tartget**:编译,运行,测试,打包生成的相关的文件都会存放在该目录下
maven常用的命令,如果不是开发工具内执行maven命令,一定要进入到你要执行命令的项目的pom文件所在的目录下执行这些命令:
**mvn clean**:清理target目录
**mvn compile**: 项目编译
**mvn test**:执行当前项目test目录下带有Junit注解的测试用例,同时会生成结果放在target目录下
**mvn package**: 按照pom文件制定的打包方式和插件打包,生成的包会在target目录下
**mvn install**:打包当前项目,同时将当前项目的打包文件发布到本地仓库
**mvn deploy** 发布到当前项目的jar包到本地仓库和远程仓库,在项目组协同工作时,基础jar包的更新必须有这个操作,否则其他项目引入就报错了,当然需要配置对应的发布仓库的地址