更多文章和资源欢迎访问:SuperCoder Blog
超详细的Maven笔记
文章目录
一、Maven安装配置
Maven官网地址:https://maven.apache.org/
下载地址:https://maven.apache.org/download.cgi
下载到本地后解压即可。
1、配置本地仓库:
在conf/settings.xml文件中配置maven本地仓库,找到如下代码块,配置localRepository
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<!-- /Users/chaishuai/dev/myRepository 本地仓库地址 -->
<localRepository>/Users/chaishuai/dev/myRepository</localRepository>
2、配置阿里云镜像:
由于maven中央仓库在国外,下载依赖速度慢,所以一般使用国内阿里云镜像仓库。在settings.xml中找到mirror标签,注释掉原本默认的,然后添加如下配置。
<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版本
如果按照默认配置运行,Java工程使用的默认JDK版本为1.5,而我们常用的JDK版本为1.8,所以可以修改默认配置。在profiles标签下添加如下profile代码块。
<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、安装JDK配置环境变量
maven是用java语言开发的,必须基于JDK运行,所以需要安装JDK并配置环境变量,详细操作此处略。
验证是否配置成功:
5、配置maven环境变量
mac系统配置如下:
export MAVEN_HOME=/Users/chaishuai/dev/apache-maven-3.2.3
export PATH=$PATH:$MAVEN_HOME/bin
验证是否配置成功:
6、maven坐标查询网址
https://mvnrepository.com/
二、pom.xml 详解
此示例pom不是一个单独的pom,只是为了记录常见标签的作用
<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:执行测试程序,测试的报告存放的目录:target/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 的 enforcer 插件
<!-- 配置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
六、搭建私服
1、Nexus下载地址:https://help.sonatype.com/repomanager3/product-information/download
由于下载链接很难打开,所以此处提供Linux系统使用的安装包,大家可下载使用。
链接: https://pan.baidu.com/s/1_x3ShxUV3FO6eOUl_Kud2A 提取码: wdeo
2、上传压缩包到Linux服务器并解压
## 上传压缩包到LInux服务器
scp 本地文件路径 服务器登录名@服务器IP:文件存放路径
## 解压缩
tar -zxvf nexus-3.38.1-01-unix.tar.gz
3、进入解压后的文件夹的bin目录启动nexus
cd nexus-3.38.1-01/bin/
## 启动nexus 注意:需要具备jdk环境
./nexus run
注意:由于nexus默认初始化堆内存大小为2073M,如果机器内存不够,会启动失败,报如下错误,需要调整nexus默认jvm参数。
进入bin/nexus.vmoptions文件
## 修改如下参数为适合自己机器的值,由于我的服务器是2G内存所以此处修改为1500M
-Xms1500m
-Xmx1500m
-XX:MaxDirectMemorySize=1500m
修改完成后保存退出,重新启动,启动成功如图
或者也可以使用./nexus start命令启动,./nexus status查询状态
4、访问nexus
nexus默认端口为8081,IP:8081即可访问。
注意:一定要记得关闭防火墙,如果使用阿里云需要配置防火墙规则
# 关闭防火墙
systemctl stop firewalld
# 查看防火墙状态
systemctl status firewalld
添加阿里云防火墙规则
配置成功后即可访问nexus界面
查看登录密码,进入nexus压缩包解压后的另一个目录sonatype-work下的nexus3目录
cd sonatype-work/nexus3/
# 查看密码
cat admin.password
显示出来的即为初始登录密码,登录名为admin
登陆后需要给admin用户设置新的密码
选择禁用匿名登录后下一步就可以使用了
5、nexus仓库介绍
Type介绍:
仓库类型 | 描述 |
---|---|
proxy | 远程仓库的代理 |
group | 通过 Nexus 获取的第三方 jar 包 |
hosted | 部署团队自主开发的jar包 |
Name介绍:
仓库名称 | 描述 |
---|---|
maven-central | Nexus 对 Maven 中央仓库的代理 |
maven-public | Nexus 默认创建,供开发人员下载使用的组仓库 |
maven-releasse | Nexus 默认创建,供开发人员部署自己 releasse jar 包的仓库 |
maven-snapshots | Nexus 默认创建,供开发人员部署自己 snapshots jar 包的仓库 |
6、本地使用nexus私服
在settings.xml中指定nexus服务器地址
<!-- 注释掉原来配置的阿里云仓库,添加如下配置 -->
<mirror>
<id>nexus-mine</id>
<mirrorOf>central</mirrorOf>
<name>Private Nexus</name>
<!-- 地址直接点对应仓库后面的copy就可以复制 -->
<url>http://IP:8081/repository/maven-public/</url>
</mirror>
因为禁用了匿名访问,所以需要在settings.xml中配置用户名密码
<server>
<!-- id需要与配置的nexus服务器地址id一样 -->
<id>nexus-mine</id>
<username>admin</username>
<!-- 密码填自己设置的密码 -->
<password>password</password>
</server>
将自己的jar包部署到nexus,需要在maven工程中pom.xml配置如下内容
<distributionManagement>
<!-- snapshotRepository的id标签必须和settings.xml中指定的mirror标签的id一致 -->
<snapshotRepository>
<id>nexus-mine</id>
<name>Nexus Snapshot</name>
<url>http://ip地址:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
配置完成后,执行mvn deploy即可部署到私服
7、修改私服代理的远程仓库地址
由于中央仓库下载jar包速度太慢,可以将私服代理地址修改为阿里云仓库,操作步骤如下: