Maven
# Maven
# 概念
# 目录布局
Maven创建项目,目录结构都是有标准的模板
目录 | 说明 |
---|---|
src/main/java | 应用程序的源代码的目录 |
src/main/resources | 项目的源文件所在的目录 |
src/main/filters | 资源筛选器文件 |
src/main/webapp | Web 应用程序源 |
src/test/java | 测试代码所在的目录 |
src/test/resources | 测试资源 |
src/test/filters | 测试资源筛选器文件 |
src/it | 集成测试(主要针对插件) |
src/assembly | 装配描述符 |
src/site | 网站 |
pom.xml | 核心配置文件,项目的描述文件 |
target | 项目构建的输出文件 |
LICENSE.txt | 项目许可证 |
NOTICE.txt | 项目所依赖的库所需的通知和归属 |
README.txt | 项目的读物 |
# 仓库
专门 存放Maven项目的位置
# 本地仓库
本地上的一个文件夹。首次应用会从远程仓库进行下载的,下次应用会在本地找,没有则下载远程
# 远程仓库
# 中央仓库
官方提供的仓库 ,也是 Macen的默认仓库
# 私服
局域网内架设私有的仓库服务器,用于提供外部远程仓库应用
# 配置本地仓库
在 根目录\conf\setting.xml
文件的 settings节点里 添加以下代码
我的本地存储位置在
D:\Maven\repository
<!-- 配置本地仓库 -->
<localRepository>D:\Maven\repository</localRepository>
# 配置远程仓库
Macen 默认仓库是 境外,下载速度慢、不便捷
于是我们选择使用 国内阿里云Macen仓库作为中央仓库镜像
阿里云镜像的托管代码可能没这么快
在 根目录\conf\setting.xml
文件的 mirrors节点里 添加以下代码(更改为阿里云Macen仓库)
<!-- 配置阿里云镜像 -->
<mirror>
<!-- 镜像的唯一标识 -->
<id>nexus-aliyun</id>
<!-- 镜像名称 -->
<name>Nexus aliyun</name>
<!-- 镜像仓库 Maven地址 -->
<url>http://Maven.aliyun.com/nexus/content/groups/public/</url>
<!-- 配置是否为中央仓库镜像,如果是,则central -->
<mirrorOf>*</mirrorOf>
</mirror>
# 核心文件pom.xml
POM是 Maven 工程的基本工作单元,是一个XML文件,包含 了项目的基本信息,用于描述项目如何构建,声明项目依赖
执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 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">
<!-- Maven模型的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如
com.companyname.project-group,Maven会将该项目打成的jar包放本地路
径:/com/companyname/project-group -->
<groupId>com.Maven</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>HelloWorld</artifactId>
<!-- 当前项目版本号:同一个项目开发过程中可以发布多个版本,此处标示0.0.1版 -->
<!-- 当前项目版本号:每个工程发布后可以发布多个版本,依赖时调取不同的版本,使用不同的版本号
当前项目版本号,snapshot为快照版本即非正式版本,release为正式发布版本
-->
<version>0.0.1-snapshot</version>
<!--打包类型,一般有jar、war、pom等-->
<packaging>jar</packaging>
<!-- 名称:可省略 ,常用于 Maven 生成的文档。-->
<name>Hello</name>
<!--项目描述:可省略,常用于 Maven 生成的文档-->
<description></description>
<!-- 项目依赖构件配置,配置项目依赖构件的坐标 -->
<dependencies>
<!-- 依赖设置 ,可以有多个dependency节点-->
<dependency>
<!-- 依赖组织名称 -->
<groupId>junit</groupId>
<!-- 依赖项目名称 -->
<artifactId>junit</artifactId>
<!-- 依赖版本名称 -->
<version>4.12</version>
<!-- 依赖范围:test包下依赖该设置 -->
<scope>test</scope>
</dependency>
</dependencies>
<!-- 项目构建配置,配置编译、运行插件等。-->
<build>
<plugins>
<!--插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
# packaging
packaging标签选项,指定项目的类型
项目类型一共有:
jar
: Java工程pom
: 聚合工程war
: Web工程
# dependencies
dependencies标签选项,指定依赖的jar包集,搭配 dependency标签实现
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
</dependencies>
# 坐标
Maven世界中有大量的构件,需要唯一标识的坐标就可以找到我们想要的坐标(其原理类似于平面几何中的坐标 x、y进行标识唯一位置的点)
Maven坐标组成部分:
groupId: 当前Maven项目组织名称
artifactId: 实际项目名称
version: 当前项目的版本 或 所依赖jar包的版本
# 生命周期
Maven拥有三套生命周期,他们相互独立互不干扰
# clean 清理项目
阶段 | 说明 |
---|---|
pre-clean | 在实际项目清理之前执行所需的流程 |
clean | 删除上一个版本生成的所有文件 |
post-clean | 执行完成项目清洁所需的流程 |
# default 构建项目(核心)
阶段 | 说明 |
---|---|
generate-resources | 生成资源以包含在包中 |
process-resources | 将资源复制并处理到目的地目录中,准备进行包装 |
compile | 编译项目的源代码 |
test-compile | 将测试源代码编译到测试目的地目录中 |
test | 使用合适的单位测试框架运行测试。这些测试不应要求对代码进行包装或部署 |
install | 将封装安装到本地存储库中,以用作本地其他项目的依赖 |
deploy | 在集成或发布环境中完成,将最终包复制到远程存储库,以便与其他开发人员和项目共享 |
··· | ··· |
注意:运行任何一个阶段的时候,它前面的所有阶段都会被运行
# site 生成项目站点
阶段 | 说明 |
---|---|
pre-site | 在实际项目站点生成之前执行所需的流程 |
site | 生成项目的站点文档 |
post-site | 执行完成站点生成和准备站点部署所需的过程 |
site-deploy | 将生成的站点文档部署到指定的 Web 服务器 |
参考文档:http://maven.apache.org/index.html (opens new window)
# IDEA应用Maven项目
# IDEA配置
- 打开所有设置(必须在这里打开设置,否则其他项目无效)
- 设置Maven项目目录
- 运行环境
# Java项目的创建
# 有骨架
- 创建项目,选择骨架
- 配置项目基本信息
- 确认信息
# 无骨架
只需关闭选中,其他步骤跟有骨架的一致
无骨架创建项目需要自行配置 pom.xml
手动将Maven文件夹补齐
# JavaWeb项目的创建
# 有骨架
步骤就一步不一样,其他剩下步骤就不赘述了!
# 无骨架
无骨架创建项目后,需要自行配置 JavaWeb信息
- 项目配置
- 手动添加Web目录
- 添加创建内容
# 构建项目
添加Tomcat插件无需运行本地的Tomcat
配置
pom.xml
<!--配置war包--> <packaging>war</packaging> <!--添加jar依赖--> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency> </dependencies> <!--添加插件--> <build> <plugins> <!--tomcat插件--> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.0</version> <!--Tomcat配置--> <configuration> <port>8080</port> <path>/</path> </configuration> </plugin> </plugins> </build>
运行配置
# 常用命令
Maven命令需要在 pom.xml
所在目录中执行
# mvn compile
生成 target目录,该目录中存放了编译后的字节码文件
# mvn clean
删除 target目录
# mvn test
在 target目录 中生成,surefire、 surefire-reports(测试报告)、test-classes(测试的字节码文件)三个文件夹
# mvn package
在 target目录 中生成本项目的 jar包 或 war包 等
# mvn install
将打包好的 jar包 安装到本地仓库,方便其他工程应用
# 组合命令
组合命令,严格遵守生命周期的执行顺序!
- mvn clean compile
- mvn clean test
- mvn clean package
- mvn clean install
- mvn clean install -D skipTests 构建项目
- mvn spring-boot:run 启动项目
# IDEA命令执行
根据下图双击即可运行相应的命令!
# Maven依赖
# 依赖管理
项目依赖管理 ,pom.xml
文件中定义jar包的GAV坐标
<dependencies>
<dependency>
<!--依赖 GAV坐标-->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<!--依赖范围-->
<scope>test</scope>
</dependency>
</dependencies>
# 依赖范围(scope)
依赖范围用于限制依赖的环境应用,指定何时提供依赖及分类路径
依赖范围值(scope) | 说明 |
---|---|
compile(默认值) | 项目的所有类路径中提供 (为所有类编译提供依赖) |
provided | 编译和测试时需要,jar包不进行打包 (以防运行环境已经存在相同的包发生冲突) |
runtime | 测试、运行时需要 |
test | 测试时需要,但不进行打包 |
··· | ··· |
依赖范围 | 主类编译路径 | 测试编译路径 | 打包且编译时有效 |
---|---|---|---|
compile | Y | Y | Y |
provided | Y | Y | - |
runtime | - | - | Y |
test | - | Y | - |
# 依赖传递
在项目往往需要引入多个依赖, 而引入的依赖又会引入其他的依赖,项目会自动引入依赖中的依赖!
假设 A项目 引入 B 和 E 依赖 ,他们有各自的依赖关系
A => B B => C C => D A => E E => D
A项目
|
├── B
│ └── C
│ └── D(2.0)
└── E
└── D(1.0)
最后 A项目 导入了D(1.0),排除D(2.0)
系统会根据导入的就近原则进行依赖应用
# 依赖排除
Maven 的依赖传递过程可选择性的排除依赖。如果依赖中有其他依赖可对其进行排除!
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!--排除依赖-->
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<!--排除依赖无需版本号-->
</exclusion>
</exclusions>
</dependency>
PS:排除依赖包中所包含的依赖关系,不需要添加版本号
假如我想在 上面假设中排除D(1.0),引入D(2.0)
···
<!--引入B依赖-->
<dependency>
<groupId>B</groupId>
<artifactId>B</artifactId>
<version>0.1</version>
<!--排除依赖-->
<exclusions>
<!--排除 B依赖 中的 依赖C-->
<exclusion>
<groupId>D</groupId>
<artifactId>D</artifactId>
<!--排除依赖无需版本号-->
</exclusion>
</exclusions>
</dependency>
<!--引入E依赖-->
<dependency>
<groupId>E</groupId>
<artifactId>E</artifactId>
<version>0.1</version>
</dependency>
···
# Mavean问题
# web项目失效
问题说明:
web文件夹目录未 被idea标识(文件夹没有小蓝点)
可能原因:
pom.xml
未配置 packaging标签 未配置war包- 项目结构未配置好
- idea缓存问题
涉及解决方案:
pom.xml
配置 packaging标签<packaging>war</packaging>
项目结构Web配置: 点击操作流程 (opens new window) (指定索引到操作流程)
清空idea缓存并重启