1. Maven
概述
1.1 概念
Maven是一个项目管理工具,有两个核心功能:依赖管理(jar包管理)、项目构建(操作维护项目);
上述两个功能的实现是通过一个POM模型对象
来实现,该对象对应的是一个pom.xml
文件;
pom.xml是整个Maven中最核心最重要的文件。
1.2 目录结构
// java项目结构
/*
Java项目(模块)根目录
├── pom.xml
└── src
├── main
│ ├── java
│ └── resources
└── test
├── java
└── resources
*/
// javaweb项目结构
/*
javaweb项目(模块)根目录
├── pom.xml
└── src
├── main
│ ├── java
│ ├── resources
│ └── webapp
│ └── WEB-INF
│ └── web.xml
└── test
├── java
└── resources
*/
1.3 安装
- 解压
建议所有的开发软件都放在同一个目录(不能有中文、空格及其他特殊字符) - 配置Path
确保已经配置了JAVA_HOME 环境变量
配置MAVAEN_HOME,值为Maven安装的根目录
配置path,引用到刚才的根目录,值为:%MAVAEN_HOME%\bin - 检测是否成功
重新打开命令行窗口,键入mvn
,如果有非错误提示,说明成功。
2. 相关概念
2.1 仓库
存储jar包的仓库
2.2 坐标
可以让Maven通过坐标快速的定位到某个jar,获取并供我们使用。站点mvnrepositry.com
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
3 配置仓库
仓库的配置只需要修改一个配置文件即可:maven安装目录下面的主配置文件conf/settings.xml
- 本地仓库
解压仓库的压缩包到某个目录,然后在settings.xml中配置如下内容:
解压我分享的仓库到下面配置的位置
<settings xmlns="http:///SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http:///SETTINGS/1.0.0 http:///xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
重点是下面的内容
-->
<localRepository>D:\Develop\Repository\Maven_Repository</localRepository>
配置好之后,在idea整合maven时,需要重新建立索引,才能让idea有提示。(仅限于先使用idea继承了maven,后解压更新了仓库)。
- 中央仓库镜像
配置阿里云对中央仓库的镜像,下载速度快。
注意放在被注释的mirrors
下面,小心层级关系
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
</mirrors>
- 私服,建议在某个项目的pom.xml文件配置
在每个/某个模块的pom.xml文件中配置如下内容,粘贴在标签下即可
<!-- 为当前模块配置私服 -->
<repositories>
<repository>
<!-- 依赖仓库id,不可重复。repositories可以配置多个仓库,如果ID重复后面配置会覆盖之前的配置 -->
<id>dependencies_Repositories</id>
<!-- 私服仓库地址,即nexus仓库组的地址 -->
<url>http://192.168.33.240:8081/repository/maven-public/</url>
<!-- 是否下载releases构件 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否下载snapshots构件 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<!-- 配置插件从私服下载 -->
<pluginRepositories>
<pluginRepository>
<id>plugins_Repositories</id>
<url>http://192.168.33.240:8081/repository/maven-public/</url>
<!-- 是否下载release版本构件 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 是否下载snapshots版本构件 -->
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
4 Maven
创建和构建
4.1 手动创建和构建(了解)
- 目录结构
- pom.xml文件结构
<?xml version="1.0" encoding="UTF-8"?>
<!-- 命名空间 -->
<project xmlns="http:///POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http:///POM/4.0.0 http:///xsd/maven-4.0.0.xsd">
<!-- MavenModel版本号,与Maven的版本号不是一回事 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司名称,一般是域名反写 -->
<groupId>com.jzh</groupId>
<!-- 项目名字 -->
<artifactId>yyyy</artifactId>
<!-- 项目版本号,SNAPSHOT 快照版 RELEASE 发行版 DEBUG 测试版 -->
<version>1.0-SNAPSHOT</version>
<!-- 该项目最终打包的方式 -->
<packaging>jar</packaging>
<!-- 导入依赖 -->
<dependencies>
<!--某一个具体的依赖坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin></plugin>
</plugins>
</build>
</project>
- 各个及对应的插件
4.2 手动命令使用模板(骨架)创建
不推荐
4.3 使用Idea
创建
- Idea集成Maven,并开启自动导入、设置使用内置骨架和编码(避免控制台/页面乱码)
-DarchetypeCatalog=internal -Dfile.encoding=GBK
或者
-DarchetypeCatalog=internal -Dfile.encoding=utf-8
其他乱码相关
// get请求乱码
// tomcat8.5及以上版本,会自动解决请求乱码问题
// tomcat8.5以下版本,需要手动解决get请求乱码问题;tomcat7插件,配置uriEncoding=utf-8即可
// 处理post请求乱码
req.setCharacterEncoding("utf-8");
// 处理响应乱码,保证在获取响应流之前设置好编码即可,否则无效
resp.setContentType("text/html;charset=utf-8");
- 创建并管理Java模块(应用、模块、项目、工程)
- 创建并管理JavaWeb模块
在第二步骤的基础上做如下内容
- 为当前模块添加一个web环境
- 在当前模块的
pom.xml
中添加<packaging>war</packaging>
,表示当前项目打成war包 - 把web文件夹移动至src/main下面,并改名为
webapp
- 确认。打开Project Stucture 确认web路径是否正确(不报红即正确)
- 项目中各个文件夹功能失效怎么解决(右击模块中对应的文件夹,选择 mark directory as )
- Maven模块的导入导出
导出:把模块文件夹复制出来就行,建议删除target
导入:把模块文件夹复制到当前项目文件夹下,然后使用idea的maven窗口添加,添加时选择对应的pom.xml即可。 - 如果在下载依赖报错后,才配置了私服,会造成不请求私服的情况。
解决方法:将当前project关闭,重新打开,重新打开后的项目会重新读取pom.xml
文件,识别其中配置的私服。 - 如果在导入依赖时,长时间卡在finished,是因为idea为maven分配的内存不足,调大即可
在 setting ==> Buid ==> Build Tools ==> Maven ==> Importing ==> VM options for importer ,修改其值为
表示为maven分配内存,最小1G,最大2G。
-Xms1024m -Xmx2048m
5. 插件
5.1 Tomcat
插件
<build>
<plugins>
<!-- Tomcat7的Maven插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<port>80</port>
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
</build>
5.2 jdk8
编译插件
<build>
<plugins>
<!-- 指定本项目JDK编译的版本为JDK1.8,并指定编码为utf-8 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
6. 依赖
6.1 配置
在pom.xml
文件中,通过dependencies
的子标签dependency
;配置成功后,maven会自动将对应版本的jar包导入到当前项目中。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
如果依赖上报红线,可以通过配置私服解决。如果配置私服无效,看4.3中第6点。
6.2 依赖传递
依赖之间、项目之间、项目和依赖之间都是有依赖传递
6.3 依赖冲突
项目中对于同一个依赖导入多次,并且版本不一致。这时就可能会产生依赖冲突,需要通过下面的思路解决。
解决思路:
- 路径优先,层级越深优先级越底
- 声明优先,被引入时声明的越早,越优先
[特殊]同一目录中,后面导入的依赖会覆盖导入的依赖
6.4 可选/排除依赖
可选依赖 - 不透明 - 私房钱 – 不知道也就不能使用
排除依赖 - 不需要 - 拒绝 - 知道你有,但是主动拒绝使用
6.5 依赖范围
常见的是compile
、test
、provided
<!-- 下面三个scope需要配置provided -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
<!-- 下面一个scope需要配置test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 其他不用配置,即使用默认值compile -->
pendency>
org.projectlombok
lombok
1.18.10
provided
junit junit 4.12 test
```