1. maven Windows下快速配置
-
配置环境变量
-
windows操作系统
-
配置 MAVEN_HOME : maven的安装目录
-
增加 Path: ;%MAVEN_HOME%\bin
-
-
-
重启电脑
-
检测是否安装成功
- mvn --version
2. maven 的作用
-
管理Jar
-
增加第三方Jar
-
解决jar包之间的依赖关系(自动关联下载所有依赖的Jar, 并且不会冲突)
-
-
将项目拆分成若干个模块
3. maven 的概念及功能
说明: 是一个基于JAVA平台的自动化构建工具, 目前最新的构建工具是gradle
- 自动化构建工具 maven: 将原材料(java, js, css, html, image ...) --> 产品(可发布的项目)
3.1 maven的功能
-
清理: 清空删除编译的结果, 为重新编译做准备
-
编译: java -> class
-
测试: 针对于项目中的关键点进行测试, 也可用项目中的测试代码取测试开发代码
-
报告: 将测试的结果进行显示
-
打包: 将项目中包含的多个文件压缩成一个文件, 用于安装或部署
-
安装: 将上一步打成的包放在本地仓库, 供其他项目使用
-
部署: 将打成的包放在服务器上准备运行
3.2 maven 仓库
说明: jar包下载流程:先在本地仓库中下载, 如果本地仓库中不存在, 则在联网到中央仓库(镜像)去下载
-
maven仓库的分类
-
本地仓库
-
远程仓库
-
中央仓库
-
中央仓库镜像(对中央仓库的分流)
-
私服
-
其他公共库
-
-
-
本地仓库详解
-
本地仓库,顾名思义,就是Maven在本地存储的地方。
-
maven的本地仓库,在安装maven后并不会创建,它是在第一次执行maven命令的时候才被创建
-
maven本地仓库的默认位置:无论是Windows还是Linux,在用户的目录下都有一个.m2/repository/的仓库目录,这就是Maven仓库的默认位置
-
默认的本地仓库: C:/Users/jefxff/.m2/repository
-
可以通过在maven/conf/settings.xml 中的
标签里修改本地仓库的目录
<settings> <!-- <localRepository>修改后的本地仓库目录</localRepository> --> <localRepository>D:/Program Files (x86)/Maven/repository</localRepository> </settings>
-
-
远程仓库-中央仓库详解
-
最核心的就是中央仓库,中央仓库是默认的远程仓库,maven在安装的时候,自带的就是中央仓库的配置,可以通过修改setting.xml文件来修改默认的中央仓库地址
-
中央仓库包含了绝大多数流行的开源Java构件,以及源码、作者信息、SCM、信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载到
<repositories> <repository> <id>central</id> <name>Central Repository</name> <url>http://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
-
4. 使用 maven
说明: maven是 约定 优于 配置的原则
4.1 maven 约定 的目录结构
-
src
-
main : 程序功能代码
-
java -java源代码文件
-
resources -资源库
-
webapp
* WEB-INF
* index.jsp
* Css、js -
Bin - 脚本库
-
config - 配置文件
-
Filters - 资源过滤库
-
-
test : 测试代码
-
java -java测试源代码文件
-
resources - 测试资源库
-
filters - 测试资源过滤库
-
-
pom.xml - 项目对象模型
-
-
target - 存放项目构建后的文件和目录,比如jar包,war包,编译的class文件等
4.2 maven核心pom文件(Project Object Model,项目对象模型)
4.2.1 pom
- pom代表项目对象模型,它是Maven中工作的基本组成单位。它是一个XML文件,始终保存在项目的基本目录中的pom.xml文件中。pom包含的对象是使用maven来构建的,pom.xml文件包含了项目的各种配置信息,需要特别注意,每个项目都只有一个pom.xml文件。
4.2.2 项目配置信息
-
project:工程的根标签
-
modelVersion:pom模型版本,maven2和3只能为4.0.0
-
groupId:这是工程组的标识。它在一个组织或者项目中通常是唯一的。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。
-
artifactId:这是工程的标识。它通常是工程的名称。例如,消费者银行。groupId 和 artifactId 一起定义了 artifact 在仓库中的位置
-
version:这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本
-
packaging:定义 Maven 项目的打包方式,有 JAR 、WAR 和 EAR 三种格式
4.2.3 最小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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xdclass</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
4.2.4 super pom
-
父(Super)POM是 Maven 默认的 POM。所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM)。父 POM 包含了一些可以被继承的默认设置。因此,当 Maven 发现需要下载 POM 中的 依赖时,它会到 Super POM 中配置的默认仓库 。
-
使用以下命令来查看 Super POM 默认配置:
mvn help:effective-pom
4.2.5 依赖配置信息
-
dependencies
-
依赖的传递性: A.jar -> B.jar -> C.jar; 要使A.jar -> C.jar : 当且仅当 B.jar 依赖于 C.jar 的范围是 compile
-
依赖的原则:(为了防止冲突)
-
路径最短优先原则
-
路径长度相同:
-
在用一个 pom.xml 文件中有2个相同的依赖(覆盖), 后面声明的依赖会覆盖前面声明的依赖
-
如果是不同的pom.xml 中有2个相同的依赖(优先), 则先声明的依赖会覆盖后声明的依赖
-
-
-
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
-
parent: 此标签用于在子pom.xml里面定义父pom.xml 的 G A V 坐标; 实现继承, 在子类的 dependencies 里面还需要通过 G V 来申明使用父类的那些依赖(即: 通过继承方便统一管理依赖的版本)
-
groupId: 父项目的组Id标识符
-
artifactId:父项目的唯一标识符
-
relativePath:(从当前的pom.xml 到 父 pom.xml 的相对路径)Maven首先在当前项目中找父项目的pom,然后在文件系统的这个位置(relativePath),然后在本地仓库,再在远程仓库找。
-
version: 父项目的版本
<parent> <groupId>xd.class<groupId> <artifactId>demo-parent</artifactId> <relativePath>/</relativePath> <version>1.0</version> </parent>
-
-
modules : 配置聚合(必须在总工程中,打包方式是pom.xml)
-
有些maven项目会做成多模块的,这个标签用于指定当前项目所包含的所有模块。之后对这个项目进行的maven操作,会让所有子模块也进行相同操作
-
Maven 可以将一个大工程拆分成若干个子工程(子模块); 而聚合可以将拆分的多个子工程合起来
<!-- 聚合的配置, 只能配置中打包方式是pom的项目中 --> <!-- 配置聚合, 避免前置工程的install操作 --> <modules> <!-- 项目的根路径 --> <module>../maven1</module> <module>../maven2</module> <module>../maven3</module> </modules> <!-- 优势: 1. 如果 maven3依赖于maven2或者maven1, 那么对maven3执行的操作, 在操作之前会先对 maven1/2 进行操作 --> <!-- 2. 对总工程pom.xml执行的maven操作会同时作用于他下面的所有模块 -->
-
-
properties
- 用于定义pom常量
<properties> <java.version>1.7</java.version> </properties>
- 上面这个常量可以在pom文件的任意地方通过${Java.version}来引用
-
dependencyManagement
-
应用场景
- 当我们的项目模块很多的时候,我们依赖包的管理就会出现很多问题,为了项目的正确运行,必须让所有的子项目使用依赖项的同一版本,确保应用的各个项目的依赖项和版本一致,才能保证测试的和发布的是相同的结果。
-
使用的好处
- 在父模块中定义后,子模块不会直接使用对应依赖,但是在使用相同依赖的时候可以不加版本号,这样的好处是,可以避免在每个使用的子项目中都声明一个版本号,这样想升级或者切换到另一个版本时,只需要在父类容器里更新,不需要任何一个子项目的修改
父项目: <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.2.0</version> <scope>test</scope> </dependency> </dependencies> </dependencyManagement> 子项目1: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> 子项目2: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> 子项目3: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>5.0</version> </dependency>
-
和dependencies的区别
-
dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
-
dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本
-
-
-
通过 pom.xml 来更改JDK版本
<profiles>
<profile>
<id>jdk-8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.conpiler.target>1.8</maven.conpiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
- pom.xml 统一版本(在 properties 中指定值, 在下面就可以使用类似于EL表达式一样使用 ${定义的属性})
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit-version>4.11</junit-version>
</properties>
5. 常用的maven基本命令
5.1 常用命令
-
mvn validate 验证项目是否正确
-
mvn package maven打包, 打成jar/war包
-
mvn generate-sources 生成源代码
-
mvn compile 编译 -- 只编译 main 目录中的Java文件
-
mvn test-compile 编译测试代码
-
mvn test 运行测试
-
mvn verify 运行检查
-
mvn clean 清理项目; 删除 target 目录, 并不会删除 install 在本地仓库的文件
-
mvn install 将开发的模块放入本地仓库, 供其他模块使用
-
mvn deploy 发布项目到远程仓库
-
mvn dependency:tree 显示Maven依赖树
-
mvn dependency:list 显示Maven依赖列表
5.2 常用参数
-
-D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试;
-
-P 指定 Profile 配置,可以用于区分环境;
5.2 web相关命令
-
mvn tomcat:run 启动tomcat
-
mvn jetty:run 启动jetty
-
mvn tomcat:deploy 运行打包部署
6. 部署 web 工程
-
创建 web 项目后, 在实施部署时, 第一种情况就是通过package打成war包, 放在tocmat/webapps中运行
-
通过maven直接部署运行web项目:
-
需要在 pom.xml 中配置 cargo 插件
-
通过maven命令: deploy
-