• 阶段六-Day02-Maven


    一、学习Maven

    使用Maven创建Web项目,并部署到服务器

    二、Maven介绍及加载原理

    1. 介绍

    Maven是使用Java语言编写的基于项目对象模型(POM)的项目管理工具。开发者可以通过一小段描述信息来管理项目的构建、报告和文档。

    使用Maven可以更好的帮助我们完成项目的管理,具体分类:

    1. 依赖管理:

    Maven给每个项目提供了一个pom.xml文件,我们可以在其中配置我们需要的第三方资源,当pom.xml文件发生变化的时候Maven会重新加载该配置文件,根据配置信息查找对应的第三方资源并导入到项目中使用。

    1. 项目构建:

    Maven提供了统一的项目构建方式,从编译到部署,并且操作简单。

    1. 插件:

    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. 一定要在标签里面配置

    2. 注意本地仓库文件夹路径的斜杠方向。直接从Windows系统中复制过来的路径中斜杠是右斜杠,而Maven配置本地目录时斜杠为左斜杠。

    3.2 配置镜像仓库

    中央仓库的访问速度比较慢,所以我们一般使用国内的镜像仓库。常用的两个镜像仓库是阿里云或华为云。

    在settings.xml中找到标签,在里面配置上表示镜像代理。

    3.2.1 阿里云
    
        
            alimaven
            aliyun maven
            http://maven.aliyun.com/nexus/content/groups/public/
            central
        
    
    3.2.1 华为云
    
        
            huaweicloud
            *
            https://mirrors.huaweicloud.com/repository/maven/
        
    

    3.3 配置JDK

    在使用Maven后,项目由Maven来完成编译和打包运行,需要指定使用的JDK版本。

    Maven的底层也是Java编写的;

    在settings.xml中找到标签,在里面配置上

    3.3.1 配置JDK11
    
        
             jdk-11
             
                true
                11
             
             
                11
                11
                11
             
        
    
    3.3.2 配置JDK8
    
        
            jdk-1.8
            
                true
                1.8
            
            
                1.8
                1.8
                1.8
            
        
    

    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直接复制粘贴到自己创建的项目文件夹根目录下。

    项目名
        src
            main
                java
                resource
            test
                java
        pom.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中默认生成下面内容:

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>com.shgroupId>
    7. <artifactId>Maven01_testartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. project>

    其中

    是根标签,必须得有的。

    自动生成,指定pom默认版本。对于Maven 2.x、Maven 3.x中modelVersion必须是4.0.0。

    表示当前项目的坐标,里面信息都是在新建项目时填写的信息。

    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. 资源拷贝插件配置示例

    里面可以配置一些插件信息。

    配置的目录。

    标签明确配置哪些文件也需要被编译。

    表示是否对拷贝的资源进行过滤。简单理解:对资源内容进行处理。

    就是可能有些资源带有${project}这种引用赋值,为了能够解析到,设置filtering:为true

    1. <build>
    2. <resources>
    3. <resource>
    4. <directory>src/main/javadirectory>
    5. <includes>
    6. <include>**/*.txtinclude>
    7. includes>
    8. <filtering>truefiltering>
    9. resource>
    10. <resource>
    11. <directory>src/main/resourcesdirectory>
    12. <filtering>truefiltering>
    13. resource>
    14. resources>
    15. build>

    七、Maven项目类型

    1. 项目类型介绍

    Maven的项目类型有三种:

    jar:相当于我们之前使用idea创建的java项目。打包主要打包.class文件。

    war:web项目类型。打包时除了src中内容,还会包含webapp目录,要比jar类型文件打包的内容更多。

    pom:聚合项目中使用。聚合项目中如果一个项目为父项目,项目类型应该为pom类型。当项目类型为pom类型时,表示该项目除了会配置pom.xml以外不会有任何其它类或资源文件。

    2. 如何修改项目类型

    在pom.xml文件中通过设置项目类型。

    pom.xml中默认没有配置标签。当没有配置时等效于jar

    八、使用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

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. 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)在中添加Tomcat7插件

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.shgroupId>
    6. <artifactId>mavenweb2artifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <packaging>warpackaging>
    9. <build>
    10. <plugins>
    11. <plugin>
    12. <groupId>org.apache.tomcat.mavengroupId>
    13. <artifactId>tomcat7-maven-pluginartifactId>
    14. <version>2.2version>
    15. <configuration>
    16. <path>/${project.artifactId}path>
    17. <port>8080port>
    18. configuration>
    19. plugin>
    20. plugins>
    21. build>
    22. 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的标签填写坐标实现依赖关系。

    开源项目的坐标是不需要记忆的,可以通过Maven中央仓库查询网站查询需要依赖的项目。网址:https://mvnrepository.com/

    例如:想要查询MySQL驱动包可以直接在搜索框中输入mysql,点击search按钮进行查询。第一个就是需要的驱动包,点击mysql-connector-java进入下个界面。

    找到对应版本

    直接把红色方框的内容复制到项目的pom.xml中,第一行注释不用复制,只复制整个标签就行。

    需要在pom.xml中添加标签,此标签下面可以有多个子标签,表示当前项目所有依赖的项目。

    配置后可以点击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 继承关系介绍

    继承下项目分为父子关系。父项目的打包方式可以为 jar | pom,无论是jar还是pom,子项目只能继承父项目的pom.xml,并不能继承src/main下的内容,所以通常使用pom。占用空间小

    的选项:

    1. pom:往往是作为父项目的角色,在父项目的pom.xml中统一管理子项目的依赖,插件,并不会将代码放到pom工程中。

    2. jar:jar就是我们经常引入的jar包或引入的依赖,本质就是java项目中字节码文件,我们是调用它里面的类,一般的jar包只包含类,配置文件,依赖,插件,不会存在静态资源等。

    3. 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文件即可,但是我们并不是所有的依赖架包都需要导入,这就需要用到依赖管理

    在父项目中可以通过管理父项目中的插件,子项目则可以选择继承哪些插件。

    修改后重新进行install。

    这是子项目的架包就会消失

    需要获取需要的架包,只输入

     组织名
     项目名

    就行了

    架包又回来了

    3.3.3 使用属性标签管理版本

    的子标签。

    名称是自定义的,里面的8.0.27是自己填写的。

    可以在标签的中通过${属性标签名}获取到定义的属性值。

    小提示:

    好处是:项目中依赖特别多时,还需要由父项目进行版本管理。可以把所有依赖的版本号都定义到里面,以后想要修改某个依赖版本时,找起来比较方便。

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    5. <modelVersion>4.0.0modelVersion>
    6. <groupId>com.bjsxtgroupId>
    7. <artifactId>projectparentartifactId>
    8. <version>1.0-SNAPSHOTversion>
    9. <properties>
    10. <mysql-version>8.0.27mysql-version>
    11. properties>
    12. <dependencyManagement>
    13. <dependencies>
    14. <dependency>
    15. <groupId>mysqlgroupId>
    16. <artifactId>mysql-connector-javaartifactId>
    17. <version>${mysql-version}version>
    18. dependency>
    19. dependencies>
    20. dependencyManagement>
    21. 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可以发现里面有两点重要配置。

    1. 为pom。

    2. 里面包含所有子项目。

    4.2.5 观察子项目

    子项目中有继承的配置。

    这些配置都是自动生成的。

    4.3 依赖,继承,聚合总结
    1. 依赖:

      1. 依赖其它项目中的类,主要是src/main中的类。

      2. 依赖和被依赖的项目都为独立的项目,依赖存在传递性,常用。

      3. 项目必须install后(jar),才能够被其他项目依赖。类和依赖都可以使用

    2. 继承:

      1. 父项目管理子项目的依赖,插件。

      2. 父子项目都为独立的项目,springboot开始常用。

      3. 项目必须install后(jar|pom),才能够被其它项目继承。

      4. 无论jar还是pom只能继承依赖,不能使用src/main中的类,常用pom。只可以使用pom.xml文件,所以常用pom;

    3. 聚合:

      1. 父项目管理子项目的依赖,插件。

      2. 一个项目中创建多个模块(每个模块可以独立运行),微服务常用。

      3. 聚合项目不需要install,每个模块都可以使用父项目中依赖,插件

      4. 聚合项目只能为pom,聚合的父项目需要指定管理哪些子项目。

    十一、部署Maven项目到服务器

    1. 部署说明

    随意编写一个web项目,使用JDBC连接服务器中数据库(可以使用昨天的表作为测试),然后部署到服务器中。

    部署Maven项目到服务器的方式有两种:

    1. 传统方式。把项目打包成war,然后上传到服务器的Tomcat中。

    2. 热部署。一键部署项目到服务器的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行(`标签的7行),配置完成后重启Tomcat

    只需要记住标签的username和password属性值,这两个属性值可以修改的,是以后访问时的用户名和密码

    1. <tomcat-users xmlns="http://tomcat.apache.org/xml"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
    4. version="1.0">
    5. <role rolename="manager-gui"/>
    6. <role rolename="manager-script"/>
    7. <role rolename="manager-jmx"/>
    8. <role rolename="manager-status"/>
    9. <role rolename="admin-gui"/>
    10. <role rolename="admin-script"/>
    11. <user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script"/>
    12. 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:为上面配置的密码

    1. <build>
    2. <plugins>
    3. <plugin>
    4. <groupId>org.apache.tomcat.mavengroupId>
    5. <artifactId>tomcat7-maven-pluginartifactId>
    6. <version>2.2version>
    7. <configuration>
    8. <url>http://192.168.8.129:8080/manager/texturl>
    9. <username>adminusername>
    10. <password>adminpassword>
    11. <path>/projectpath>
    12. configuration>
    13. plugin>
    14. plugins>
    15. 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生成站点。但是需要添加插件才能使用。

     站点插件

    1. <build>
    2. <plugins>
    3. <plugin>
    4. <groupId>org.apache.maven.pluginsgroupId>
    5. <artifactId>maven-project-info-reports-pluginartifactId>
    6. <version>2.7version>
    7. plugin>
    8. plugins>
    9. 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方法之前和之后运行的方法。

    1. /*
    2. 单元测试:
    3. 正常情况下,项目应该有一个主方法,通过运行主方法所在类,让整个项目运行起来。
    4. 在项目规格比较大的情况下,如果希望只测试其中某个方法,单独运行一个方法,这时就叫单元测试。
    5. junit单元适用于非web环境。
    6. */
    7. public class MyTest {
    8. /*
    9. 适用于只需要在方法上添加@Test注解。
    10. */
    11. @Test
    12. public void test(){
    13. System.out.println("test");
    14. }
    15. /*
    16. 要求方法必须是public void的,如果不是会出现运行时异常。
    17. */
    18. @Test
    19. public void test123(){
    20. System.out.println("test2");
    21. }
    22. @Before
    23. public void isbefore(){
    24. System.out.println("before");
    25. }
    26. @After
    27. public void after(){
    28. System.out.println("after");
    29. }
    30. }

    十四、scope(面试题)

    1. scope介绍

    在pom.xml中标签有一个子标签,表示当前依赖的域(域:有效范围)。

    scope可取值:

    取值解释
    compile默认值,不配置scope时的取值,表示依赖参与整个项目的编译、打包、测试、发布。也就是说:编译时需要使用、测试时需要使用、最终打包时会包含。属于一种强依赖。
    provided仅编译时生效,项目最终被打包时不会包含该依赖。常见servlet的依赖时需要配置。
    runtime运行时生效。表示编译时不参与,但是参与项目的测试、打包。该依赖被打包时会被包含。
    test仅测试时生效,这个包中的类只能在src/main/test中使用。常用在junit依赖时需要被配置。
    system类似provided,但是需要结合systemPath属性,表示依赖不是来源于本地库,而是来源于其他目录。使用较少,在一些特殊项目中才可能被使用。

    2. 使用方式

    在pom.xml中配置依赖时添加标签就可以了。

    1. <dependencies>
    2. <dependency>
    3. <groupId>junitgroupId>
    4. <artifactId>junitartifactId>
    5. <version>4.13.2version>
    6. <scope>testscope>
    7. dependency>
    8. dependencies>

    十五、Maven的Web项目引用servlet依赖时的注意事项

    1. 注意事项说明

    小提示:

    1. Maven的Web项目需要依赖servlet-api和jsp-api。

    2. 使用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,表示只在编译时生效。

    1. <dependencies>
    2. <dependency>
    3. <groupId>javax.servletgroupId>
    4. <artifactId>javax.servlet-apiartifactId>
    5. <version>4.0.1version>
    6. <scope>providedscope>
    7. dependency>
    8. <dependency>
    9. <groupId>javax.servlet.jspgroupId>
    10. <artifactId>javax.servlet.jsp-apiartifactId>
    11. <version>2.3.3version>
    12. <scope>providedscope>
    13. dependency>
    14. dependencies>

  • 相关阅读:
    MPP 架构在 OLAP 数据库的运用
    2022年全国职业院校技能大赛:网络系统管理项目-模块B--Windows样题10
    GaussDB数据库SQL系列-层次递归查询
    八.AV Foundation 视频播放 - 通过手势控制播放器
    人类真的与恐龙无缘见面吗?看看雕刻和绘画怎样说
    爬虫实训案例:中国大学排名
    【云原生之k8s】k8s资源限制以及探针检查
    Apollo + LGSVL联合仿真
    百度网盘可以自动备份电脑文件吗?
    python多进程(二)一些基础属性和方法
  • 原文地址:https://blog.csdn.net/m0_59163770/article/details/133689820