Maven
概念:Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件
- 是一个基于Java平台的 自动化构建工具 make-ant-maven-gradle
- 自动化构建工具maven:将 原材料(java、js、css、html、图片)->产品(可发布项目)
- 编译-打包-部署-测试 –> 自动构建
作用:
- 增加第三方Jar包
- jar包之间的依赖关系 (自动关联下载所有依赖的Jar,并且不会冲突)
- 依赖:A中的某些类 需要使用B中的某些类,则称为A依赖于B
- 在maven项目中,如果要使用 一个当时不存在的Jar或模块,则可以通过 依赖实现(去本地仓库、中央仓库去寻找)
- 将项目拆分成若干个模块
实现的功能:
- 清理:删除编译的结果,为重新编译做准备。
编译:java->class
测试: 针对于 项目中的关键点进行测试,亦可用 项目中的测试代码 去测试开发代码;
报告:将测试的结果 进行显示
打包: 将项目中包含的多个文件 压缩成一个文件, 用于安装或部署。 (java项目-jar、web项目-war)
安装:将打成的包 放到 本地仓库,供其他项目使用。
部署:将打成的包 放到 服务器上准备运行。--将java、js、jsp等各个文件 进行筛选、组装,变成一个 可以直接运行的项目
- 手动部署方式:
- 通过Eclipse中Add and Remove按钮进行部署
- 将Web项目打成一个war包,然后将该war包复制到tomcat/webapps中 即可执行运行
- 手动部署方式:
下载配置:
- 下载maven: http://archive.apache.org/dist/maven/maven-3/
- 配置JAVA_HOME(maven是基于java的工具)
- 配置MAVEN_HOME/M2_HOME : D:\apache-maven-3.5.3
- 配置path :%MAVEN_HOME%\bin
- 验证 :mvn -v
- 配置本地仓库 maven目录/conf/settings.xml
- 默认本地仓库 :C:/Users/YANQUN/.m2/repository
- 修改本地仓库:
D:/mvnrep
使用maven
约定 优于 配置(约定:使用默认值)
maven约定的目录结构:
- src
- main:程序功能代码
- java:java代码
- resources:资源代码、配置代码
- test:测试代码
- java
- resources
- main:程序功能代码
- pom.xml
pom.xml: gav:用于在本地仓库中定位 <groupId>域名翻转.大项目名</groupId> <groupId>org.lanqiao.maven</groupId> <artifactId>子模块名</artifactId> <artifactId>HelloWorld</artifactId> <version>版本号</version> <version>0.0.1-SNAPSHOT</version>
- src
maven常见命令(必须在pom.xml所在目录中执行)
(第一次执行命令时,因为需要下载执行该命令的基础环境,所以会从中央仓库下载该环境到本地仓库)
- mvn compile 编译–只编译main目录中的java文件
- mvn test 测试
- mvn package 打包jar/war
- mvn install 将开发的模块 放入本地仓库,供其他模块使用 (放入的位置 是通过gav决定)
- mvn clean 删除target目录(删除编译文件的目录)
依赖:
jar包依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.0</version>
<scope>test</scope>
</dependency>
* version动态化(统一版本):
1. <properties>
<lanqiao.World.junit.version>4.0</lanqiao.World.junit.version>
</properties>
2.<version>${lanqiao.World.junit.version}</version>
工程依赖:
<dependency>
<groupId>cn.hm</groupId>
<artifactId>maven_dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
scope:依赖范围,依赖的有效性
- compile(默认) :在编译、部署(运行)可以获得该依赖
- test:在测试可以获得该依赖
- provided:在编译、测试可以获得该依赖
依赖排除
A.jar ->B.jar 当我们通过maven引入A.jar时,会自动引入B.jar,不引入:排除依赖
<!-- 排除依赖 beans --> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> </exclusions>
依赖的传递性
A.jar-B.jar->C.jar
要使 A.jar ->C.jar:当且仅当 B.jar 依赖于C.jar的范围是compile
依赖原则:为了防止冲突
路径最短优先原则(手动声明>间接引入)
路径长度相同:
- (一个模块)在同一个pom.xml文件中有2个相同的依赖(覆盖):后面声明的依赖 会覆盖前面声明的依赖 (严禁使用本情况,严禁在同一个pom中声明2个版本不同的依赖)
- (两个模块)如果是不同的 pom.xml中有2个相同的依赖(优先):则先声明的依赖 ,会覆盖后声明的依赖
版本锁定:使用dependencyManagement标签,将其包版本锁定,作用只是锁定,并不会引入jar包,如果需要直接引入Jar包依赖即可,不再需要版本号
<!--版本锁定--> <dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>spring-beans</artifactId> <version>4.12</version> </dependency> </dependencies> </dependencyManagement> <!--引入坐标,不需要版本号--> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>spring-beans</artifactId> </dependency> </dependencies>
多个maven项目(模块)之间如何 依赖: p项目 依赖于 –> q项目
q项 目 install 到本地仓库
p项目 依赖:
<!-- 本项目 依赖于HelloWorld2项目 --> <dependency> <groupId>org.lanqiao.maven</groupId> <artifactId>HelloWorld2</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
聚合:
使用:
在一个总(父)工程中配置聚合(pom.xml)
<modules> <!--项目在本地仓库的根路径 --> <module>../Maven1</module>(不分顺序,maven会自行判断) <module>../Maven2</module> </modules>
以后只需要操作总工程即可操作聚合中的工程
Maven将一个大工程拆分成 若干个子工程(子模块)
聚合可以将拆分的多个子工程 合起来
在Eclipse中创建maven工程:
创建maven工程:new Maven Project –> 第一个勾选上 –> g大项目a项目名v版本填写(项目在本地仓库的定位)
- 打包方式:
java工程——jar
web项目-war
父工程-pom
- 打包方式:
在Eclipse中配置maven
- 配置maven版本:Window –> Preferences –> Installations –> add(找maven安装目录)
- 配置本地仓库 : 设置settings.xml(Window –> Preferences –> User Settings –>Browser(找settings.xml))
- 在pom.xml中编写依赖,编写后需要更新maven:maven-update project
- 执行命令:右键pom.xml –> Run As –> Maven Build … —>Goals:写命令(test/compile…)
maven生命周期:
生命周期和构建的关系:
生命周期中的顺序:a b c d e 当我们执行c命令,则实际执行的是 a b c
生命周期包含的阶段:3个阶段
clean lifecycle :清理
pre-clean clean post-clearn
default lifecycle :默认(常用)
site lifecycle:站点
pre-site site post-site site-deploy
修改项目的jdk:
build path:删除旧版本,增加新版本
右键项目-属性-Project Factors -java version 改版本 (之前存在要改的版本)
通过maven统一jdk版本:
pom.xml <profiles> <profile> <id>jdk-18</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> </profiles>
在Idea中创建maven工程:
web项目部署到Tomcat服务器
maven项目结构
- 创建子模块
继承实现步骤:(用于统一jar包版本)
.建立父工程: 父工程的打包方式必须为pom
<groupId>org.lanqiao.maven</groupId> <artifactId>B</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>pom</packaging>
在父工程的pom.xml中编写依赖:
通常父工程不导入Jar包,只进行版本锁定,子工程直接导入jar包即可
<dependencyManagement> <dependencies> <dependency>
子类:
<!-- 给当前工程 继承一个父工程: 1.加入父工程坐标gav 2.当前工程的Pom.xml到父工程的Pom.xml之间的 相对路径 --> <parent> <!-- 1加入父工程坐标gav --> <groupId>org.lanqiao.maven</groupId> <artifactId>B</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 2当前工程的Pom.xml到父工程的Pom.xml之间的 相对路径,该标签可省 --> <relativePath>../B/pom.xml</relativePath> </parent>
在子类中 需要声明 :使用父类的哪些依赖
<dependency> <!-- 声明:需要使用到父类的junit (只需要ga) --> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency>
部署Web工程:war
实际开发中,开发人员 将自己的项目开发完毕后 打成war包(package) 交给实施人员去部署
通过maven直接部署运行web项目(了解):
- 在pom.xml中配置cargo
- maven命令发布:deploy
Maven工程创建web项目
不使用骨架创建普通项目
选择工程
- 增加webapp
4.打成War包
分模块开发maven工程
构建工程
创建父工程
<packaging>pom</packaging>
创建子工程,继承于父工程
<parent> <!-- 1加入父工程坐标gav --> <groupId>org.lanqiao.maven</groupId> <artifactId>B</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 2当前工程的Pom.xml到父工程的Pom.xml之间的 相对路径,该标签可省 --> <relativePath>../B/pom.xml</relativePath> </parent>
在父工程中,聚合所有子工程
<modules> <!--项目在本地仓库的根路径 --> <module>../Maven1</module>(不分顺序,maven会自行判断) <module>../Maven2</module> </modules>
在父工程中,进行版本锁定
<dependencyManagement> <dependencies> <dependency>
子工程导入jar包,子工程相互依赖
<dependency> <groupId>cn.hm</groupId> <artifactId>maven_dao</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
完善代码
将每个部分的代码完善,需要引入Jar包的在子工程引入
部署到tomcat
如:SSM中,父工程中有子工程:pojo、dao、service、web
其中父工程是pom打包方式,web是war包方式,其他为jar包方式
部署tomcat的是web子工程