一、学习Maven
使用Maven创建Web项目,并部署到服务器。
二、Maven介绍及加载原理
1. 介绍
Maven是使用Java语言编写的基于项目对象模型(POM)的项目管理工具。开发者可以通过一小段描述信息来管理项目的构建、报告和文档。
使用Maven可以更好的帮助我们完成项目的管理,具体分类:
-
依赖管理:
Maven给每个项目提供了一个pom.xml文件,我们可以在其中配置我们需要的第三方资源,当pom.xml文件发生变化的时候Maven会重新加载该配置文件,根据配置信息查找对应的第三方资源并导入到项目中使用。
-
项目构建:
Maven提供了统一的项目构建方式,从编译到部署,并且操作简单。
-
插件:
Maven提供了丰富的插件,比如项目打包插件,测试插件,Tomcat插件等等。
2. Maven加载原理
Maven工具会根据pom模型(pom.xml)加载当前项目需要使用的资源。
每次加载都是从本机某个指定的文件夹去加载。如果本机文件夹中没有这个资源,会从Maven远程服务器中下载到本机文件夹,Maven再去加载本机文件夹中资源。
专业概念:
中央仓库(Central Repository):Maven官方服务器。里面存放了绝大多数市面上流行的jar。也允许用户注册后,上传自己的项目到官方服务器。
本地仓库(Local Repository): 本机的文件夹。 镜像仓库(Mirror Repository):对于国内来说,访问国外的Maven仓库会特别慢。镜像仓库就是另一台备份/复制了中央仓库的服务器。平时使用时国内开发者多使用阿里云镜像或华为云镜像,这样可以大大提升从中央仓库下载资源的速度。
资源坐标:每个Maven需要使用的资源都有一个坐标,通过坐标可以精确告诉服务器需要的是哪个资源由三部分组成:
GroupId:一般是逆向公司域名 com.sh。同一个公司的GroupId都是相同的。
ArtifactId:一般是项目(jar)名 mysql-connector-java。
Version:版本号 8.0.28。
3. Maven和Ant对比
Ant和Maven都是Apache的项目管理工具,也都是Java程序非常常用的编译、运行、测试、打包工具。虽然都是项目管理工具,但是因为Maven就是基于Ant研究出来的,可以说Ant有的功能Maven都有,但是Maven有的功能Ant不一定有。
无论是IDEA还是Eclipse,Java项目都默认使用Ant进行项目的管理。在老Ant项目中需要自己添加build文件,但是在目前的java项目中已经不再需要自己进行管理,都是通过idea或eclipse帮助管理即可。
Maven项目在创建时需要明确的指定项目类型为maven项目,整个Maven项目采用约定的方式,文件等内容都有固定的位置,通过pom模型进行管理项目。同时Maven具有中央仓库和本地仓库,这点也是优于Ant的一大特点,在移植项目时只需要移植源码即可。并且Maven项目是有完整生命周期的,而Ant是没有的。
三、Maven安装和配置
Maven是一款独立的软件,可以独立运行,也可以集成到IDEA中运行。这点和Tomcat有点像(可以独立运行,也可以集成到IDEA中。但是集成后使用更加方便)。
1. 下载
首先我们从maven官网下载Maven,官网地址:Maven – Welcome to Apache Maven 。
进入到官网后,点击logo下的download进入到下载页面
Binary是二进制文件,是class文件
Source是带有源码的文件
2. 安装
从官网下载的是zip格式,解压缩后就可以直接使用,但是建议安装目录中不要包含中文(作为一个程序员,不管什么情况下路径都不要出现中文,这是软件安装过程中能够减少出错非常重要的原因)。
maven的安装目录:
3. 配置
编辑安装目录下的conf子目录中的settings.xml文件,完成如下配置。
3.1 配置本地仓库
Maven默认情况下会把C:/用户/用户名/.m2/repository目录当作本地仓库目录.
.m2和repository默认不存在,Maven会自动创建这两个文件夹。
也可以自己设置本地仓库的路径
配置时注意:
1. 一定要在<settings>
标签里面配置<localRepository>
。
2. 注意本地仓库文件夹路径的斜杠方向。直接从Windows系统中复制过来的路径中斜杠是右斜杠,而Maven配置本地目录时斜杠为左斜杠。
3.2 配置镜像仓库
中央仓库的访问速度比较慢,所以我们一般使用国内的镜像仓库。常用的两个镜像仓库是阿里云或华为云。
在settings.xml中找到<mirrors>
标签,在里面配置上<mirror>
表示镜像代理。
3.2.1 阿里云
<mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror> </mirrors>
3.2.1 华为云
<mirrors><mirror><id>huaweicloud</id><mirrorOf>*</mirrorOf><url>https://mirrors.huaweicloud.com/repository/maven/</url></mirror> </mirrors>
3.3 配置JDK
在使用Maven后,项目由Maven来完成编译和打包运行,需要指定使用的JDK版本。
Maven的底层也是Java编写的;
在settings.xml中找到<profiles>
标签,在里面配置上<profile>
。
3.3.1 配置JDK11
<profiles><profile><id>jdk-11</id><activation><activeByDefault>true</activeByDefault><jdk>11</jdk></activation><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><maven.compiler.compilerVersion>11</maven.compiler.compilerVersion></properties></profile> </profiles>
3.3.2 配置JDK8
<profiles><profile><id>jdk-1.8</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>
4. 配置Maven环境变量
为了使Maven在其他路径下也能使用,我们也需要配置环境变量
Maven环境变量配置和JDK的环境变量配置类似。需要先找到环境变量配置窗口,步骤如下:
我的电脑 -> 鼠标右键点击 -> 属性 -> 高级系统设置 -> 高级 -> 环境变量 。
5. 检查Maven环境变量是否配置成功
在命令行工具中输入:mvn -version查看。只要没有提示没有这个命令,说明环境变量配置成功了。
下图为正确执行命令后的显示效果,一共5行输出,分别代表:
(1)当前Maven的版本。
(2)Maven安装的主目录。这个值和环境变量配置的MAVEN_HOME的值是相同的。
(3)所依赖的Java版本。
(4)使用哪国语言及默认编码。
(5)系统名称、版本、架构、具体系统分类。
6. 新建Java项目
在计算机D盘根目录下新建Java项目。Maven项目有着严格项目结构要求。必须按照下面结构创建。
注意:
(1)项目名:名称最好是英文名称。
(2)下面每个缩进都表示子文件夹的意思。例如:src是项目文件夹的子文件夹、main是src的子文件夹、main和test是同级目录。
(3)pom.xml和src是同级的。把pom.xml直接复制粘贴到自己创建的项目文件夹根目录下。
项目名srcmainjavaresourcetestjavapom.xml
注意:test目录下也可以有resource
7. 打包项目
在Windows系统中打开命令行工具(快捷寻找:Win R,在呼出框“运行”中输入cmd)。
在命令行依次输出下面命令。需要注意:mvn install必须在项目文件夹内运行。
需要的文件也已经下载
三、IDEA集成Maven
1. 默认配置
IDEA 菜单 File -> Settings -> Build,Execution,Deployment -> Build Tools -> Maven。
IDEA中默认已经集成了Maven(安装IDEA时,IDEA软件里面已经包含了Maven软件,不需要单独下载Maven),可以不用做任何修改。如果想要修改,可以按照图示(1)(2)(3)箭头所指进行修改即可。(建议不修改,此处只是为了让同学知道IDEA中Maven如何进行修改,以后在公司内如果碰见了需要修改的情况,也难不住同学们)。
默认情况:
(1)默认IDEA 2019.2.4中集成3.6.1。安装上IDEA已经自带了这个Maven,不需要去官网下载。
(2)User settings file:默认集成Maven的配置文件,请注意此目录。通过勾选(2)箭头所指复选框,可以修改配置文件路径。 (3)Local repository: 本地仓库路径。和配置文件是同一个文件夹。 通过勾选(3)箭头所指复选框,可以修改本地仓库路径。
下面这个重要技巧一定要学会
重要技巧: 可以直接在C:/用户/用户名/目录下新建.m2文件夹(如果已经有了.m2就不用新建了),去今天授课目录/软件目录中把settings.xml文件粘贴到.m2目录中。
settings.xml文件中的maven的版本号要和idea中的maven相互匹配,否则还是默认的本地仓库
四、IDEA创建Maven项目
1. 新建项目
IDEA 菜单 File -> New -> Project ...
或者在主页Create New Project
2. 选择项目类型
3. 填写项目信息
每个Maven项目都有自己的坐标。
GroupId:公司网址倒写。我们在尚学堂学习过程中,GroupId都写成com.sh。
ArtifactId:项目名。项目名随意起,不建议写成中文。示例中叫做ideamaven。
Version:默认就有。目前对我们来说不需要修改。其中1.0 表示版本号,SNAPSHOT表示快照(当Version中带有SNAPSHOT发布到中央仓库或私服时会上传到快照库。而Version中不带有SNAPSHOT的项目会发布到public库。由于我们也不使用私服,所以带不带SNAPSHOT没有影响)。
五、Maven项目结构详解
1. 解释说明
每个目录解释说明如下:
ideamaven // 项目名。
.idea // IDEA中所有项目都会生成这个文件夹。
src
main
java // 所有.java源文件存放位置。
resource // 除了.java文件,其他文件都放入到这个目录。编译候会把此目录所有内容直接放入到classes目录。
test
java // 所有测试类的目录。
ideamaven.iml // IDEA配置文件,IDEA中项目都会生成这个文件。
pom.xml // Maven最重要的文件,学习Maven很大一部分都在学习此文件如何编写。
External Libraries // 当前项目所有依赖的jar。
3. pom.xml文件内容说明
整个项目中唯一需要说明的就是pom.xml文件。
创建的Maven项目在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"><modelVersion>4.0.0</modelVersion><groupId>com.sh</groupId><artifactId>Maven01_test</artifactId><version>1.0-SNAPSHOT</version>
</project>
其中
<project>
是根标签,必须得有的。
<modelVersion>
自动生成,指定pom默认版本。对于Maven 2.x、Maven 3.x中modelVersion必须是4.0.0。
<groupId>
、<artifactId>
、<version>
表示当前项目的坐标,里面信息都是在新建项目时填写的信息。
4. 编译后结构
4.1 新建类
为了演示编译后的目录结构。在项目的src/main/java中新建com.sh.Test类,并在类中编写主方法,输出Hello。
4.2 新建普通文件
在com.sh包下新建test.txt文件(这个文件只要不是.java文件,都能演示出我们最终结果。
4.3 在resources新建文件
并且在src/main/resources中新建readme.txt(随意新建一个任意名称,任意类型的文件,文件里面也不需要写任何内容)。
4.4 运行Test类
运行Test类。
4.5 运行后效果图
运行后会在当前项目中自动生成target目录。target/classes 目录就是项目编译后的类目录。
5. 编译的结果总结
(1)src/main/java 编译后不存在了。只保留里面的包和类,并且类被编译成.class文件,放入到target/classes目录中。
(2)src/main/java 编译后不存在了。
(3)src/main/resources 编译后不存在了。把resources目录里面所有的内容直接放入到classes目录中。
六、资源拷贝插件(MyBatis框架必用)
1. 为什么需要配置资源拷贝插件
在Maven项目中约定是src/main/java 只编译.java 文件,src/main/resources编译资源文件。
如果由于一些原因,必须在src/main/java中放置一些非.java文件(例如:MyBatis框架中就有这样的场景),还希望Maven去编译这些文件,这时就必须配置资源拷贝插件。
就是在java源码中也可能需要一些并不是.java的文件,但是在编译之后生成的target中并不会编译保存这些文件,为了解决这个问题,需要配置拷贝插件
2. 资源拷贝插件配置示例
<build>
里面可以配置一些插件信息。
<directory>
配置的目录。
<includes>
标签明确配置哪些文件也需要被编译。
<filtering>
表示是否对拷贝的资源进行过滤。简单理解:对资源内容进行处理。
就是可能有些资源带有${project}这种引用赋值,为了能够解析到,设置filtering:为true
<build><!-- 只要配置资源拷贝插件必须得配置的标签,里面可以有多个resource标签 --><!-- 每个resource希望编译哪个目录--><resources><resource><!-- 希望编译的目录 --><directory>src/main/java</directory><!-- Maven在这个目录原有功能不变,额外再添加其他的类型 --><includes><!-- 告诉Maven还需要编译什么类型的文件 --><!-- ** 目录及目录,理解成任意子目录--><!-- *.txt 中 * 任意名称文件,.txt 扩展名类型--><include>**/*.txt</include><!-- 如果还希望编译其他类型时再写个include标签 -->
<!-- <include>**/*.xml</include>--></includes><!-- 是否在编译文件过程中,对文件内容进行过滤处理。是否对文件中内容进行操作 --><filtering>true</filtering></resource><!-- 如果不配置,resources中内容不再进行编译 --><!-- 只要配置上,把原有约定生效--><resource><directory>src/main/resources</directory><filtering>true</filtering></resource></resources></build>
七、Maven项目类型
1. 项目类型介绍
Maven的项目类型有三种:
jar:相当于我们之前使用idea创建的java项目。打包主要打包.class文件。
war:web项目类型。打包时除了src中内容,还会包含webapp目录,要比jar类型文件打包的内容更多。
pom:聚合项目中使用。聚合项目中如果一个项目为父项目,项目类型应该为pom类型。当项目类型为pom类型时,表示该项目除了会配置pom.xml以外不会有任何其它类或资源文件。
2. 如何修改项目类型
在pom.xml文件中通过<packaging>
设置项目类型。
pom.xml中默认没有配置<packaging>
标签。当没有配置<packaging>
时等效于<packging>jar<packaging>
。
八、使用Maven创建Web项目
1. 介绍
使用Maven创建Web项目有两种方式:
(1)创建普通Maven项目,手动添加webapp目录。
(2)使用原型创建Maven项目,手动添加src目录。
2. 创建项目后添加webapp目录
2.1 创建普通Maven项目
示例中创建了名称为mavenweb1的项目。
2.2 手动添加目录
在src/main下新建webapp/WEB-INF/web.xml。
web.xml文件可以直接复制过来。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0">
</web-app>
必须按图中格式创建
2.3 添加web模块
2.3.1 为什么需要添加web模块
创建的webapp目录默认是不会被编译的,右键点击webapp目录时, 选择New也没有JSP文件。
2.3.2 如何添加web模块
选择IDEA菜单 File -> Project Structure...
分别点击 Modules -> + -> Web
3. 使用原型创建web项目(和上面步骤2等效,二选一)
3.1 新建项目
使用原型创建web项目,在新建项目部分就有区别:
1. 先勾选create from archetype前面的复选框。
2. 然后选择org.apache.maven.archetypes:maven-archetype-webapp
3.2 添加java目录
使用原型创建的项目自动包含webapp文件夹,且文件夹图标里面有个点,说明已经设置了web模块。里面已经包含了META-INF/web.xml,还自动包含了index.jsp
但是项目里面没有编写Java类的目录,需要手动添加。在src/main下新建java文件夹。
3.3 设置java目录为资源目录
resources和test同理设置
九、发布项目到Tomcat中
1. 说明
Web项目想要运行是无法离开Servlet容器的。Maven管理的Web项目也需要有Servlet容器的。我们学习过的Servlet容器就是Tomcat。
Maven的Web项目发布到Tomcat中,有两种方式:
(1)使用本机的Tomcat。
(2)使用Maven的Tomcat插件。
都是将项目导成war包
2. 使用本机的Tomcat步骤
使用本机的Tomcat和之前的Java EE项目发布步骤相同。需要在自己计算机中单独下载Tomcat软件。
2.1 检查是否设置了Artifact
如果使用原型创建的web项目IDEA已经帮助创建了Artifact。
如果没有使用原型,后添加web模块方式,是没有Artifact的,这时就需要手动添加。
点击IDEA菜单 File -> Project Structure...
-
Exploded:直接生成一个目录(开发)。分散的
-
Archive:生成一个war包(部署)。集合的
2.2 添加Tomcat
点击IDEA工具栏的Add Configuration...
添加Tomcat Server。
与之前项目配置一样
2.3 选择Tomcat
选择自己的Tomcat,如果之前没有配置过,点击右侧的Configure...按钮进行配置
2.4 添加Artifact
按图所示添加Artifact。如果点击加号后没有Artifact,说明了步骤2.1没有做。
2.5 启动Tomcat
在IDEA工具栏上选择刚刚添加的Tomcat Server,然后点击绿色三角的启动按钮。
3. 使用Maven的Tomcat插件
Maven带有插件功能,可以把其他软件集成进来,对Maven的功能进行扩展。
使用Tomcat插件不需要在本机下载Tomcat软件,由Maven自动下载插件,插件中包含了Tomcat软件
3.1 配置插件
在项目的pom.xml中配置Tomcat插件。
配置时包含两个步骤:
(1)设置项目类型为war,这个事情后面总有人忘记。如果没有修改成war,运行时控制台会显示BUILD SUCCESS。而不是正常web项目启动日志。
(2)在<build>
中添加Tomcat7插件
<?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"><modelVersion>4.0.0</modelVersion><groupId>com.sh</groupId><artifactId>mavenweb2</artifactId><version>1.0-SNAPSHOT</version><!-- 必须设置导出类型为war,因为是导入到tomcat中使用--><packaging>war</packaging><build><plugins><!-- 配置Tomcat--><!-- Tomcat插件 --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><!-- 设置的路径--><!-- 这里设置的就是项目的artifactId,就是项目名--><path>/${project.artifactId}</path><!--发布到Tomcat的名称,即URL访问名称,平时多使用/--><port>8080</port><!-- 端口,平时多使用80或8080 --></configuration></plugin></plugins></build>
</project>
3.2 启动Tomcat
点击IDEA右侧Maven面板,选择要运行的项目 -> Plugins -> tomcat7 -> tomcat7:run
可以设置多个端口号,启动多个Tomcat
3.3 观察启动结果
3.4 关闭和重启的强调
3.4.1 正常关闭和重启
正常关闭和重启都是在控制台中进行操作。
3.4.2 没有关闭Tomcat,再次启动会出现端口号冲突问题
如果当前有一个Tomcat在运行,而又去点击Maven面板的tomcat7:run 会在Run面板上面选项卡又出现了一项,并且在控制台提示端口号冲突。
十、POM模型中的几种关系
1. 总体介绍
在POM模型中定义了三种关系:依赖、继承、聚合。
Maven基于POM模型的项目管理工具,所以这三种关系在Maven中都存在。
其中依赖关系可以说从学习完Maven每天都使用的,继承关系会在学习完Spring Boot后经常使用,聚合关系一般都出现在分布式、微服务架构的项目中。
2. 依赖关系
2.1 演示依赖中央仓库中项目
当一个项目需要使用到其他项目的内容时,就可以使用依赖。
只要依赖的项目(可以是自己的项目,也可以是开源项目)存在于本地仓库,就可以通过pom.xml的<dependency>
标签填写坐标实现依赖关系。
开源项目的坐标是不需要记忆的,可以通过Maven中央仓库查询网站查询需要依赖的项目。网址:https://mvnrepository.com/
例如:想要查询MySQL驱动包可以直接在搜索框中输入mysql,点击search按钮进行查询。第一个就是需要的驱动包,点击mysql-connector-java进入下个界面。
找到对应版本
直接把红色方框的内容复制到项目的pom.xml中,第一行注释不用复制,只复制整个<dependency>
标签就行。
需要在pom.xml中添加<dependencies>
标签,此标签下面可以有多个<dependency>
子标签,表示当前项目所有依赖的项目。
配置后可以点击Maven面板左上角的刷新按钮。
可以通过项目左侧查看依赖是否导入成功,如果导入成功会出现当前项目导入的内容。
2.2 依赖的传递性
2.2.1 依赖传递性介绍
假设项目A依赖项目B,项目B依赖项目C,这时会发现项目A中包含了项目C的依赖,这就是依赖的传递性。
2.2.2 依赖传递性效果展示
2.2.2.1 新建项目3
新建Maven项目名称为mavenweb03。
在项目2中直接点击Maven面板的install,表示把项目安装到本地仓库。根据Maven加载原理知道,Maven都是从本地仓库加载内容的,所以此处需要install一下。
小提示:
install命令可以使项目导入一个jar包或者war包,也会将该包保存在本地仓库中
2.2.2.2 让项目3依赖项目2
2中有一个Test类
3依赖之后也可以使用Test类
3中也有mysql的依赖
依赖具有传递性
a -> b -> c c中既有b得依赖也有a得依赖
2.3 重复依赖问题
重复依赖原则
当项目中依赖内容比较多时,可能出现重复依赖的问题,尤其依赖传递性导致的重复依赖。
重复依赖原则:
路径不同间接依赖中maven采用的是路径最短者优先。就近原则
路径相同间接依赖中maven采用的是依赖定义顺序从上到下,下边优先级更高。
重复的依赖,不同的版本,谁离得近,谁生效
3. 继承关系
3.1 继承关系介绍
继承下项目分为父子关系。父项目的<packing>
打包方式可以为 jar | pom,无论是jar还是pom,子项目只能继承父项目的pom.xml,并不能继承src/main下的内容,所以通常使用pom。占用空间小
<packing></packing>
的选项:
-
pom:往往是作为父项目的角色,在父项目的pom.xml中统一管理子项目的依赖,插件,并不会将代码放到pom工程中。
-
jar:jar就是我们经常引入的jar包或引入的依赖,本质就是java项目中字节码文件,我们是调用它里面的类,一般的jar包只包含类,配置文件,依赖,插件,不会存在静态资源等。
-
war:本质就是web项目,跟jar不同的是它可以有静态资源的存在,比如Html,css,图片等等。
-
如果想要使用另一个项目的类,这种关系在Maven中叫做依赖。
因为除了传递需要得依赖,类也会传递过去
-
如果想要使用另一个项目的依赖,插件,这种关系在Maven中叫做继承。
只传递需要得依赖
3.2 继承关系代码演示
3.2.1 新建项目mavenparent
新建项目mavenparent,在pom.xml中随意配置一个依赖。
配置完成后通过Maven面板中install把项目安装到本地仓库。
类中有一个方法
3.2.2 新建项目mavenchild
依赖导入进来了,但是类中的方法不能使用
3.3 依赖管理
3.3.1 依赖管理说明
当我们需要一个项目中的依赖架包时,可以使用依赖关系让其他项目继承与该项目,继承只传递依赖,导出成pom文件即可,但是我们并不是所有的依赖架包都需要导入,这就需要用到依赖管理
在父项目中可以通过<pluginManagement>
管理父项目中的插件,子项目则可以选择继承哪些插件。
修改后重新进行install。
这是子项目的架包就会消失
需要获取需要的架包,只输入
<groupId> 组织名
<artifactId> 项目名
就行了
架包又回来了
3.3.3 使用属性标签管理版本
<properties>
是<project>
的子标签。
<mysql-version>
名称是自定义的,里面的8.0.27是自己填写的。
可以在<dependency>
标签的<version>
中通过${属性标签名}获取到定义的属性值。
小提示:
好处是:项目中依赖特别多时,还需要由父项目进行版本管理。可以把所有依赖的版本号都定义到<properties>
里面,以后想要修改某个依赖版本时,找起来比较方便。
<?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"><modelVersion>4.0.0</modelVersion><groupId>com.bjsxt</groupId><artifactId>projectparent</artifactId><version>1.0-SNAPSHOT</version><!-- 自定义属性时,需要通过properties标签 --><properties><!-- 标签名自定义。一般都以xxx-version进行命名 --><mysql-version>8.0.27</mysql-version></properties><!-- 在<dependencies>标签外面多了一层<dependencyManagement>--><dependencyManagement><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><!-- 通过${属性名}可以获取到<properties>中标签的值 --><version>${mysql-version}</version></dependency></dependencies></dependencyManagement>
<!-- 下面是控制子项目插件版本时的写法-->
<!-- <build>-->
<!-- <pluginManagement>-->
<!-- <plugins>--><!-- </plugins>-->
<!-- </pluginManagement>-->
<!-- </build>-->
</project>
4. 聚合关系
4.1 聚合关系说明
聚合关系的前提:继承。
聚合主要用在后面的分布式架构或微服务架构的项目,对于目前的单体架构项目来说很少使用聚合项目。
聚合项目最大的好处:在一个父项目中创建多个模块,所有的模块都是独立的,可以独立运行。且父项目不需要install,子模块就可以继承父项目的pom中的依赖。
4.2 聚合项目演示
4.2.1 新建普通Maven项目
示例中项目名称为:mavenparent。
4.2.2 创建子项目
鼠标右键点击项目 -> New -> Module...
4.2.3 创建子项目过程特殊说明
创建聚合项目过程和创建普通Maven项目类似。唯一的区别是填写坐标过程中GroupID和Version是不允许修改的,必须和父项目的相同。ArtifactId根据自己的需要进行填写。
4.2.4 观察父项目
查看mavenparent中pom.xml可以发现里面有两点重要配置。
-
<packaging>
为pom。 -
<modules>
里面包含所有子项目。
4.2.5 观察子项目
子项目中有继承的配置。
这些配置都是自动生成的。
4.3 依赖,继承,聚合总结
-
依赖:
-
依赖其它项目中的类,主要是src/main中的类。
-
依赖和被依赖的项目都为独立的项目,依赖存在传递性,常用。
-
项目必须install后(jar),才能够被其他项目依赖。类和依赖都可以使用
-
-
继承:
-
父项目管理子项目的依赖,插件。
-
父子项目都为独立的项目,springboot开始常用。
-
项目必须install后(jar|pom),才能够被其它项目继承。
-
无论jar还是pom只能继承依赖,不能使用src/main中的类,常用pom。只可以使用pom.xml文件,所以常用pom;
-
-
聚合:
-
父项目管理子项目的依赖,插件。
-
一个项目中创建多个模块(每个模块可以独立运行),微服务常用。
-
聚合项目不需要install,每个模块都可以使用父项目中依赖,插件
-
聚合项目只能为pom,聚合的父项目需要指定管理哪些子项目。
-
十一、部署Maven项目到服务器
1. 部署说明
随意编写一个web项目,使用JDBC连接服务器中数据库(可以使用昨天的表作为测试),然后部署到服务器中。
部署Maven项目到服务器的方式有两种:
-
传统方式。把项目打包成war,然后上传到服务器的Tomcat中。
-
热部署。一键部署项目到服务器的Tomcat中。
2. 手动部署
将项目进行打包打成war包,再把war包放Tomcat的webapps中进行执行
3.热部署方式
3.1 热部署概念介绍
使用Maven的Tomcat插件可以实现把项目一键部署到服务器的Tomcat中,这种部署方式不需要重启Tomcat,称为热部署。
3.2 配置Tomcat远程访问
想要使用热部署就必须先配置Tomcat自带的manager项目。Manager项目支持可视化管理Tomcat中项目,也支持使用命令管理Tomcat中项目。
可以通过Tomcat的Root项目首页中Manager App按钮进入到Manager项目
Tomcat默认不允许远程访问
在Linux中设置远程访问权限的修改
vim /usr/soft/tomcat8/webapps/manager/META-INF/context.xml
开启tomcat
访问tomcat的主页
需要登录,这里也要设置用户名和密码
根据API页面的说明,打开Tomcat安装目录下的conf目录下的tomcat-users.xml文件,完成配置。
使用XShell操作服务器中Tomcat,配置文件所在路径: /usr/local/tomcat/conf/tomcat-users.xml
在文件中添加7行(<role>和
<user>`标签的7行),配置完成后重启Tomcat
只需要记住<user>
标签的username和password属性值,这两个属性值可以修改的,是以后访问时的用户名和密码
<tomcat-users xmlns="http://tomcat.apache.org/xml"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"version="1.0">
<!--NOTE: By default, no user is included in the "manager-gui" role requiredto operate the "/manager/html" web application. If you wish to use this app,you must define such a user - the username and password are arbitrary. It isstrongly recommended that you do NOT use one of the users in the commented outsection below since they are intended for use with the examples webapplication.
-->
<!--NOTE: The sample user and role entries below are intended for use with theexamples web application. They are wrapped in a comment and thus are ignoredwhen reading this file. If you wish to configure these users for use with theexamples web application, do not forget to remove the <!.. ..> that surroundsthem. You will also need to set the passwords to something appropriate.
-->
<!--<role rolename="tomcat"/><role rolename="role1"/><user username="tomcat" password="<must-be-changed>" roles="tomcat"/><user username="both" password="<must-be-changed>" roles="tomcat,role1"/><user username="role1" password="<must-be-changed>" roles="role1"/>
-->
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
</tomcat-users>
重启Tomcat,让配置生效
3.3 测试配置的结果
在浏览器访问服务器Tomcat。http://ip:8080 。
点击Manager App按钮,并输入用户名和密码。会进入manager项目界面。里面是Tomcat中所有项目。
3.4 修改项目的Tomcat插件配置
在配置好Tomcat的远程账号和密码以及角色信息后,Tomcat不能关闭,保持运行状态。
在需要远程部署的Maven的项目的pom.xml文件配置远程部署的账号密码以及url地址。
小提示:
URL:IP和端口为服务器IP和服务器中Tomcat的端口,/manager/text 是固定的
username:为上面配置的用户名
password:为上面配置的密码
<!--配置插件-->
<build>
<plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><!-- 域名也可以 --><url>http://192.168.8.129:8080/manager/text</url><username>admin</username><password>admin</password><path>/project</path><!-- 发布到Tomcat的名称,也是以后访问的名称 --></configuration></plugin>
</plugins>
</build>
3.5 部署项目
配置好后在Maven面板,找到项目下的Plugins,选择tomcat:deploy即可进行远程部署,如果服务器中已经存在这个项目,再次运行会报错。
建议直接点击tomcat7:redeploy进行第一次或第N次部署。
十二、Maven命令和项目生命周期
1. 常用命令
除了可以像今天最开始那样在命令行工具输出Maven命令,也可以在IDEA中输入命令。
选择Maven面板中命令按钮,图标为m
点击后弹出命令界面,可以在里面输入命令。Maven所有命令都是以mvn开头的。
常用指令:
常用指令 | 指令含义 |
---|---|
mvn help:system | 打印系统属性和环境变量 |
mvn clean | 删除target目录,清理所有之前所有编译的内容。手动删除target目录和运行此命令是等效的。 |
mvn validate | 验证项目是否可用 |
mvn compile | 编译项目,生成target目录 |
mvn test | 执行测试。执行测试时会自动运行src/test/java 目录下所有/*Test.java、/Test.java、**/TestCase.java 文件,采用约定方式执行。 |
mvn package | 打包项目 |
mvn deploy | 发布项目 |
mvn verify | 校验包是否正确 |
mvn install | 安装到本地仓库 |
mvn site | 生成站点。但是需要添加插件才能使用。 |
站点插件
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-project-info-reports-plugin</artifactId><version>2.7</version></plugin></plugins>
</build>
2. Maven项目生命周期(面试题)
Maven有三套相互独立的生命周期(Lifecycle ):
-
Clean Lifecycle:做一些清理工作;
-
Default Lifecycle:构建的核心部分、编译、测试、打包、部署等;
-
Site Lifecycle:生成项目报告、站点、发布站点;
其中Default Lifecycle包含如下阶段:
-
validate
- 验证项目是否正确并且所有必要的信息都可用 -
compile
- 编译项目的源代码 -
test
- 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求打包或部署代码 -
package
- 将编译后的代码打包成可分发的格式,例如 JAR。 -
verify
- 对集成测试的结果进行任何检查,以确保满足质量标准 -
install
- 将包安装到本地存储库中,作为本地其他项目的依赖项 -
deploy
- 在构建环境中完成,将最终包复制到远程存储库以与其他开发人员和项目共享
生命周期的每个阶段必须按照严格的执行顺序,当然我们可以执行任意一个阶段,但是每个阶段都会从第一个阶段开始执行。可以通过maven的命令来执行每个阶段的操作,也可以使用Maven和IDEA集成后提供的图形界面来完成操作,通过图形界面相对比较简单,直接选择相对应的阶段双击运行即可。
运行的时候都会从头开始运行
十三、单元测试
1. 单元测试介绍
单元测试:独立运行项目中某个或某些方法。
Java中常见的单元测试工具:Junit
在Maven项目中src/main/test包是专门编写单元测试的包。
2. 单元测试的使用
2.1 导入依赖
添加junit依赖
2.2 编写测试类
在src/main/test下新建任意类,类名不能叫做Test。
在类中提供任意方法,方法上添加@Test注解,双击方法名后,鼠标右键点击Run 方法名,运行方法。
在Junit除了@Test还提供了@Before和@After,分别代表在运行@Test方法之前和之后运行的方法。
/*
单元测试:正常情况下,项目应该有一个主方法,通过运行主方法所在类,让整个项目运行起来。在项目规格比较大的情况下,如果希望只测试其中某个方法,单独运行一个方法,这时就叫单元测试。junit单元适用于非web环境。*/
public class MyTest {/*适用于只需要在方法上添加@Test注解。*/@Testpublic void test(){System.out.println("test");}/*要求方法必须是public void的,如果不是会出现运行时异常。*/@Testpublic void test123(){System.out.println("test2");}@Beforepublic void isbefore(){System.out.println("before");}@Afterpublic void after(){System.out.println("after");}
}
十四、scope(面试题)
1. scope介绍
在pom.xml中<dependency>
标签有一个<scope>
子标签,表示当前依赖的域(域:有效范围)。
scope可取值:
取值 | 解释 |
---|---|
compile | 默认值,不配置scope时的取值,表示依赖参与整个项目的编译、打包、测试、发布。也就是说:编译时需要使用、测试时需要使用、最终打包时会包含。属于一种强依赖。 |
provided | 仅编译时生效,项目最终被打包时不会包含该依赖。常见servlet的依赖时需要配置。 |
runtime | 运行时生效。表示编译时不参与,但是参与项目的测试、打包。该依赖被打包时会被包含。 |
test | 仅测试时生效,这个包中的类只能在src/main/test中使用。常用在junit依赖时需要被配置。 |
system | 类似provided,但是需要结合systemPath属性,表示依赖不是来源于本地库,而是来源于其他目录。使用较少,在一些特殊项目中才可能被使用。 |
2. 使用方式
在pom.xml中配置依赖时添加<scope>
标签就可以了。
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency>
</dependencies>
十五、Maven的Web项目引用servlet依赖时的注意事项
1. 注意事项说明
小提示:
Maven的Web项目需要依赖servlet-api和jsp-api。
使用Tomcat插件时会有下面问题。
项目中需要导入servlet-api和jsp-api作为编译时使用,使用Maven的Tomcat插件时,插件本身已经包含了servlet-api和jsp-api。
如果这两个依赖设置scope为compile,打包后在插件的tomcat中就出现了两个servlet-api和jsp-api,访问servlet时会报错。
所以在导入servlet-api和jsp-api时一定要设置scope为provided,表示只在编译时生效。
<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>javax.servlet.jsp-api</artifactId><version>2.3.3</version><scope>provided</scope></dependency>
</dependencies>