1,Maven 简介
项目构件管理工具,提供了一种简洁的方式来定义项目结构、构建过程和依赖管理。
2,常用命令
1. install 安装 jar 包
mvn install:install-file -DgroupId=org.slf4j -DartifactId=slf4j-simple -Dversion=2.0.0 -Dpackaging=jar -Dfile=D:\gaox\software\slf4j-simple-2.0.0.jar
3,pom 文件
1,常用 pom 标签
1. packing
打包类型:pom,jar,war
- pom:父类型
- jar:内部调用或者作服务使用(默认)
- war:打包用在服务器上部署项目
父项目必须是 pom
<packaging>pom</packaging>
2. scope
在dependency标签下有一个scope标签,该标签的作用是可以设置依赖在项目的使用阶段,通常来说,项目包含:编译、运行、测试、打包这些不同的阶段
-
compile:编译依赖范围,默认值,适用于所有阶段,编译、运行、测试、打包都会包含项目中,并且会传递依赖。
-
test:测试依赖范围,只在测试时使用,不会随项目发布,比如 junit,只有在测试代码中可以使用该依赖提供的资源。
将依赖 scope 改为 test
<!--market-common-->
<dependency>
<groupId>org.example</groupId>
<artifactId>market-common</artifactId>
<scope>test</scope>
</dependency>
此时正常 src/main 下的无法找到依赖中的资源
测试可以通过
- provided:已提供范围依赖,表示环境中(JDK 或者容器)会提供该支持,可以通过编译、测试阶段,打包均能通过,但是打包不会将该依赖打进 war 包,但是运行到该依赖的内容时,需要容器提供,否则会无法找到资源。例如servlet.jar,这个包在 tomcat 容器中 lib 目录已经提供了,因此打包时servlet.jar 无需包含在项目中,当然自己把 jar 包放进 tomcat 的 lib 目录中也是可以的(测试过)。以上针对 war 包,jar 包的时候不知道是不是将依赖打进了内置的容器,运行时依然会通过(测试过)。
<dependency>
<groupId>org.example</groupId>
<artifactId>myPackage</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
在 idea 中,由于 provided 会导致运行需要环境提供,所以可能导致 ClassNotFoundException,需要设置一下。
-
runtime:运行时范围依赖,在运行的时候才会用到该依赖,适用运行和测试阶段,编译无法通过。典型的例子时 JDBC 驱动实现,项目主代码的编译只需要JDK提供的JDBC接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体JDBC驱动。既然运行时也要使用 scope 设为 runtime 的依赖,所以 scope 为 runtime 的依赖在项目打部署包的时候(即构建 artifact)会被一起打包,会放在 WEB-INF/lib 目录下。用的不多,不做深究。
-
system:类似 provided,需要显式提供包含依赖的 jar 的路径(使用 systemPath 标签),Maven 不会在仓库中查找它,而是根据 systemPath 提供的路径去寻找。
当 scope=system 时候依赖不会自动打包进去,需要添加参数:
这个 scope 不推荐使用,不做深究,使用的话可以参考打包方式 2.1 项目引入第三方 jar 包和本地 jar 包
- import:这个跟上述几个不同,是和
一起用于导入 pom 配置。由于 maven 是单根继承机制,也就是只能有一个 parent 标签,而POM文件的parent标签一般都是继承spring-boot-starter-parent。当我们还想继承其他的父类或者让父类的依赖更加清晰和好管理时,可以通过 scope=import 来实现。scope=import 只能用在 dependencyManagement 里面,且仅用于 type=pom 的 dependency。它的作用就是相当于引入了某个 pom 文件,然后我们可以选择性的使用该 pom 文件下的哪个依赖
以 spring-cloud 依赖举例:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 这里引入上面 pom 文件中的某个依赖,可以不指定版本,因为在上面import的文件中已经定义了版本号 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
Scope 总结表格:
2,pom 文件示例
1) 父 pom
<!--
1,xml 版本
2,编码
-->
<?xml version="1.0" encoding="UTF-8"?>
<!-- project是pom文件的根元素 是标签:根标签,表示对当前工程进行配置、管理 -->
<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">
<!-- 描述pom文件遵循从哪个版本的项目描述符 modelVersion 标签:从Maven 2 开始就固定为4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!--
描述坐标信息
groupId:项目组织唯一标识
artifactId:项目唯一标识
version:版本
-->
<groupId>org.example</groupId>
<artifactId>market</artifactId>
<version>1.0-SNAPSHOT</version>
<!--
描述信息
name:项目名称,仅是描述标识
url:链接地址
description: 描述信息
-->
<name>market</name>
<url>http://www.baidu.com</url>
<description>管理系统</description>
<!-- 子模块信息 -->
<modules>
<module>market-gateway</module>
<module>market-config</module>
</modules>
<!-- 打包类型 -->
<packaging>pom</packaging>
<!-- 一些自定义属性,一般用来定义依赖版本,使用 ${} 引用 -->
<properties>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<servlet-version>3.1.0</servlet-version>
<jackson-version>2.11.1</jackson-version>
<webflux-version>2.3.2.RELEASE</webflux-version>
</properties>
<!-- 引入的依赖 -->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${springboot.version}</version>
<!--依赖作用范围-->
<scope>test</scope>
<!-- 引入时需要排除的依赖 -->
<exclusions>
<exclusion>
<artifactId>junit</artifactId>
<groupId>junit</groupId>
</exclusion>
<exclusion>
<artifactId>junit-jupiter-api</artifactId>
<groupId>org.junit.jupiter</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!--声明依赖但不引入,一般在父 pom 中才有-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.example</groupId>
<artifactId>market-common</artifactId>
<version>${project.version}</version>
</dependency>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
2)子 pom
<?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">
<!-- 父 pom 依赖 -->
<parent>
<artifactId>market</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<!--打包方式-->
<packaging>war</packaging>
<modelVersion>4.0.0</modelVersion>
<!--定位信息默认继承父 pom-->
<artifactId>market-gateway</artifactId>
<properties>
<failOnMissingWebXml>false</failOnMissingWebXml>
</properties>
<!--
1,默认会继承父 pom 的 dependencies 标签的依赖包,当然也可以在这里覆盖掉
2,如果引用父 pom 的 dependencyManager 声明的依赖,可以忽略版本,使用父 pom 声明的版本,这样就做到版本同一管理
-->
<dependencies>
<!-- MySql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
</dependencies>
<build>
<!-- 打包插件 -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>