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://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"> <!-- 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://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"> <!-- 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