Maven笔记
一、安装
1、配置本地仓库
在conf/settings.xml
文件中配置maven
本地仓库
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- 本地仓库地址 -->
<localRepository>D:/local/repository</localRepository>
2、配置阿里云镜像
在conf/settings.xml
文件中配置中央仓库的地址
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
3、配置maven工程的基础JDK版本(可选)
maven默认的jdk版本为1.5,可以选择进行修改。
<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>
4、maven坐标查询网址
https://mvnrepository.com/
二、pom.xml 中各标签属性详解
<modelVersion>4.0.0</modelVersion>
<!-- 当前Maven工程的坐标 -->
<groupId>cn.com.supercoder</groupId>
<artifactId>supercoder-maven-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 当前Maven工程的打包方式,可选值有下面三种: -->
<!-- jar:表示这个工程是一个Java工程 -->
<!-- war:表示这个工程是一个Web工程 -->
<!-- pom:表示这个工程是“管理其他工程”的工程 -->
<packaging>jar</packaging>
<!-- parent标签指定当前工程的父工程 -->
<parent>
<!-- 父工程的坐标 -->
<groupId>cn.com.supercoder</groupId>
<artifactId>supercoder-maven-demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,可以省略 -->
<!-- <groupId>cn.com.supercoder</groupId> -->
<artifactId>supercoder-maven-demo1</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->
<!--modules 和 module 标签配置当前父工程包含的子模块-->
<modules>
<module>supercoder-maven-demo1</module>
<module>supercoder-maven-demo2</module>
<module>supercoder-maven-demo3</module>
</modules>
<!-- 当前工程名称 -->
<name>supercoder-maven-demo</name>
<url>http://maven.apache.org</url>
<!--配置属性集-->
<properties>
<!-- 工程构建过程中读取源码时使用的字符集 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 通过自定义属性,统一指定Spring的版本 -->
<spring.version>5.3.18</spring.version>
</properties>
<!-- 当前工程所依赖的jar包 -->
<dependencies>
<!-- 使用dependency配置一个具体的依赖 -->
<dependency>
<!-- 在dependency标签内使用具体的坐标依赖jar包 -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!-- scope标签配置依赖的范围 -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
<!-- 使用excludes标签排除依赖 -->
<exclusions>
<!-- 在exclude标签中配置具体要排除的依赖 -->
<exclusion>
<!-- 指定要排除的依赖的坐标(不需要写version) -->
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 在父工程中使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程,只是指明版本号-->
<!-- 子工程中依然需要引入以来,只是不需要声明版本号,起到统一依赖版本号的作用 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<!-- 使用${}引用自定义属性声明版本号,方便统一管理 -->
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<!-- 表示该依赖是可选的,即可有可无 -->
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<!-- Maven在构建过程中相关配置 -->
<build>
<!-- 构建过程中用到的插件 -->
<plugins>
<!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
<!-- 插件用到的依赖 -->
<dependencies>
<!-- 逆向工程的核心依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
<!-- 配置多套环境信息,在特定环境激活特定profile -->
<profile>
<id>dev</id>
<activation>
<!-- 配置是否默认激活 -->
<activeByDefault>false</activeByDefault>
<!-- 指定激活条件为:JDK 1.6 -->
<jdk>1.6</jdk>
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
<property>
<name>mavenVersion</name>
<value>2.0.5</value>
</property>
<file>
<exists>file2.properties</exists>
<missing>file1.properties</missing>
</file>
</activation>
<!-- Maven 为了能够通过 profile 实现各不同运行环境切换,提供了一种资源属性过滤的机制。-->
<!-- 通过属性替换实现不同环境使用不同的参数 -->
<properties>
<dev.jdbc.user>root</dev.jdbc.user>
<dev.jdbc.password>root</dev.jdbc.password>
<dev.jdbc.url>http://localhost:3306/db</dev.jdbc.url>
<dev.jdbc.driver>com.mysql.jdbc.Driver</dev.jdbc.driver>
</properties>
<build>
<resources>
<resource>
<!-- 表示为这里指定的目录开启资源过滤功能 -->
<directory>src/main/resources</directory>
<!-- 将资源过滤功能打开 -->
<filtering>true</filtering>
</resource>
</resources>
</build>
</profile>
三、maven命令
mvn clean 删除target目录
mvn compile 编译源代码,编译结果存放目录,target/classes
mvn test-compile 测试程序编译,编译结果存放目录, target/test-classes
mvn test 执行测试程序,程序的报告存放目录,tsrget/surefire-reports
mvn package 打包程序,存放目录,target
mvn install 安装jar包到本地仓库,在仓库中的路径对应项目的坐标
mvn deploy 部署jar包到远程仓库
mvn dependency:list 查看当前工程所依赖的jar包列表
mvn dependency:tree 以树形结构查看当前工程的依赖信息
mvn help:active-profiles 列出所有激活的profile,以及它们在哪里定义
mvn compile -P 在编译时指定要激活的profile
四、依赖范围
main目录(空间) | test目录(空间) | 开发过程(时间) | 部署到服务器(时间) | |
---|---|---|---|---|
compile | 有效 | 有效 | 有效 | 有效 |
test | 无效 | 有效 | 有效 | 无效 |
provided | 有效 | 有效 | 有效 | 无效 |
总结:
- compile:通常使用的 jar 包都是以 compile 范围进行依赖的,是默认值。
- test:测试使用的 jar 包,以 test 范围依赖进来。比如 junit。
- provided:在开发过程中需要用到的“服务器上的 jar 包”需要以 provided 范围依赖进来。比如 servlet-api、jsp-api。而这些范围的 jar 包之所以不参与部署是为了避免和服务器上已有的同类 jar 包产生冲突。
- runtime:用于编译时不需要,运行时需要的 jar 包。
五、依赖冲突
1、maven版本仲裁机制
- 最短路径优先原则。
- 路径相同的情况下先声明的优先。
2、解决办法
在冲突的jar包中选定一个,通过exclusions 排除依赖,或者是明确声明使用某个依赖。
3、排查依赖冲突的插件
- IDEA的 maven helper 插件
- maven 的 enforce 插件
<!-- 配置enforcer插件 -->
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce-dependencies</id>
<phase>validate</phase>
<goals>
<goal>display-info</goal>
<goal>enforce</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.codehaus.mojo</groupId>
<artifactId>extra-enforcer-rules</artifactId>
<version>1.0-beta-4</version>
</dependency>
</dependencies>
<configuration>
<rules>
<banDuplicateClasses>
<findAllDuplicates>true</findAllDuplicates>
</banDuplicateClasses>
</rules>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
执行 enforcer插件的命令 : mvn clean package enforcer:enforce