阶段六-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。

阶段六-Day02-Maven_第1张图片

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进入到下载页面

阶段六-Day02-Maven_第2张图片

Binary是二进制文件,是class文件

Source是带有源码的文件

2. 安装

从官网下载的是zip格式,解压缩后就可以直接使用,但是建议安装目录中不要包含中文(作为一个程序员,不管什么情况下路径都不要出现中文,这是软件安装过程中能够减少出错非常重要的原因)。

maven的安装目录:

阶段六-Day02-Maven_第3张图片

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/
    

阶段六-Day02-Maven_第4张图片

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
        
    

阶段六-Day02-Maven_第5张图片

4. 配置Maven环境变量

为了使Maven在其他路径下也能使用,我们也需要配置环境变量

Maven环境变量配置和JDK的环境变量配置类似。需要先找到环境变量配置窗口,步骤如下:

我的电脑 -> 鼠标右键点击 -> 属性 -> 高级系统设置 -> 高级 -> 环境变量 。

阶段六-Day02-Maven_第6张图片

阶段六-Day02-Maven_第7张图片

5. 检查Maven环境变量是否配置成功

在命令行工具中输入:mvn -version查看。只要没有提示没有这个命令,说明环境变量配置成功了。

下图为正确执行命令后的显示效果,一共5行输出,分别代表:

(1)当前Maven的版本。

(2)Maven安装的主目录。这个值和环境变量配置的MAVEN_HOME的值是相同的。

(3)所依赖的Java版本。

(4)使用哪国语言及默认编码。

(5)系统名称、版本、架构、具体系统分类。

阶段六-Day02-Maven_第8张图片

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

阶段六-Day02-Maven_第9张图片

阶段六-Day02-Maven_第10张图片

阶段六-Day02-Maven_第11张图片

 注意:test目录下也可以有resource

阶段六-Day02-Maven_第12张图片

7. 打包项目

在Windows系统中打开命令行工具(快捷寻找:Win R,在呼出框“运行”中输入cmd)。

在命令行依次输出下面命令。需要注意:mvn install必须在项目文件夹内运行。

阶段六-Day02-Maven_第13张图片

阶段六-Day02-Maven_第14张图片

需要的文件也已经下载

阶段六-Day02-Maven_第15张图片

三、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目录中。

阶段六-Day02-Maven_第16张图片 

settings.xml文件中的maven的版本号要和idea中的maven相互匹配,否则还是默认的本地仓库

四、IDEA创建Maven项目

1. 新建项目

IDEA 菜单 File -> New -> Project ...

阶段六-Day02-Maven_第17张图片

或者在主页Create New Project

阶段六-Day02-Maven_第18张图片

2. 选择项目类型

阶段六-Day02-Maven_第19张图片

3. 填写项目信息

每个Maven项目都有自己的坐标。

GroupId:公司网址倒写。我们在尚学堂学习过程中,GroupId都写成com.sh。

ArtifactId:项目名。项目名随意起,不建议写成中文。示例中叫做ideamaven。

Version:默认就有。目前对我们来说不需要修改。其中1.0 表示版本号,SNAPSHOT表示快照(当Version中带有SNAPSHOT发布到中央仓库或私服时会上传到快照库。而Version中不带有SNAPSHOT的项目会发布到public库。由于我们也不使用私服,所以带不带SNAPSHOT没有影响)。

阶段六-Day02-Maven_第20张图片

五、Maven项目结构详解

阶段六-Day02-Maven_第21张图片

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中默认生成下面内容:



    4.0.0

    com.sh
    Maven01_test
    1.0-SNAPSHOT

其中

是根标签,必须得有的。

自动生成,指定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 目录就是项目编译后的类目录。

阶段六-Day02-Maven_第22张图片

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

    
        
        
        
            
                
                src/main/java
                
                
                    
                    
                    
                    **/*.txt
                    

                
                
                true
            
            
            
            
                src/main/resources
                true
            
        
    

七、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



必须按图中格式创建

阶段六-Day02-Maven_第23张图片

2.3 添加web模块
2.3.1 为什么需要添加web模块

创建的webapp目录默认是不会被编译的,右键点击webapp目录时, 选择New也没有JSP文件。

2.3.2 如何添加web模块

选择IDEA菜单 File -> Project Structure...

分别点击 Modules -> + -> Web

阶段六-Day02-Maven_第24张图片

3. 使用原型创建web项目(和上面步骤2等效,二选一)

3.1 新建项目

使用原型创建web项目,在新建项目部分就有区别:

1. 先勾选create from archetype前面的复选框。

2. 然后选择org.apache.maven.archetypes:maven-archetype-webapp

阶段六-Day02-Maven_第25张图片

3.2 添加java目录

使用原型创建的项目自动包含webapp文件夹,且文件夹图标里面有个点,说明已经设置了web模块。里面已经包含了META-INF/web.xml,还自动包含了index.jsp

但是项目里面没有编写Java类的目录,需要手动添加。在src/main下新建java文件夹。

3.3 设置java目录为资源目录

阶段六-Day02-Maven_第26张图片

resources和test同理设置

阶段六-Day02-Maven_第27张图片

九、发布项目到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。

阶段六-Day02-Maven_第28张图片

如果没有使用原型,后添加web模块方式,是没有Artifact的,这时就需要手动添加。

点击IDEA菜单 File -> Project Structure...

  • Exploded:直接生成一个目录(开发)。分散的

  • Archive:生成一个war包(部署)。集合的

阶段六-Day02-Maven_第29张图片

2.2 添加Tomcat

点击IDEA工具栏的Add Configuration...

添加Tomcat Server。

与之前项目配置一样

2.3 选择Tomcat

选择自己的Tomcat,如果之前没有配置过,点击右侧的Configure...按钮进行配置

阶段六-Day02-Maven_第30张图片

2.4 添加Artifact

按图所示添加Artifact。如果点击加号后没有Artifact,说明了步骤2.1没有做。

阶段六-Day02-Maven_第31张图片

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插件




  4.0.0

  com.sh
  mavenweb2
  1.0-SNAPSHOT
  
  war

  
    
      
      
      
        org.apache.tomcat.maven
        tomcat7-maven-plugin
        2.2
        
          
          
          /${project.artifactId}
          8080
        
      
    
  

3.2 启动Tomcat

点击IDEA右侧Maven面板,选择要运行的项目 -> Plugins -> tomcat7 -> tomcat7:run

阶段六-Day02-Maven_第32张图片

可以设置多个端口号,启动多个Tomcat

3.3 观察启动结果
阶段六-Day02-Maven_第33张图片
3.4 关闭和重启的强调
3.4.1 正常关闭和重启

正常关闭和重启都是在控制台中进行操作。

阶段六-Day02-Maven_第34张图片

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进入下个界面。

阶段六-Day02-Maven_第35张图片

找到对应版本

阶段六-Day02-Maven_第36张图片

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

阶段六-Day02-Maven_第37张图片

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

阶段六-Day02-Maven_第38张图片

配置后可以点击Maven面板左上角的刷新按钮。

可以通过项目左侧查看依赖是否导入成功,如果导入成功会出现当前项目导入的内容。

阶段六-Day02-Maven_第39张图片

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

阶段六-Day02-Maven_第40张图片

阶段六-Day02-Maven_第41张图片

2中有一个Test类

阶段六-Day02-Maven_第42张图片

3依赖之后也可以使用Test类

阶段六-Day02-Maven_第43张图片

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把项目安装到本地仓库。

类中有一个方法

阶段六-Day02-Maven_第44张图片

阶段六-Day02-Maven_第45张图片

3.2.2 新建项目mavenchild

阶段六-Day02-Maven_第46张图片

 阶段六-Day02-Maven_第47张图片

依赖导入进来了,但是类中的方法不能使用

阶段六-Day02-Maven_第48张图片

3.3 依赖管理
3.3.1 依赖管理说明

当我们需要一个项目中的依赖架包时,可以使用依赖关系让其他项目继承与该项目,继承只传递依赖,导出成pom文件即可,但是我们并不是所有的依赖架包都需要导入,这就需要用到依赖管理

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

阶段六-Day02-Maven_第49张图片

修改后重新进行install。

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

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

 组织名
 项目名

就行了

阶段六-Day02-Maven_第50张图片

架包又回来了

3.3.3 使用属性标签管理版本

的子标签。

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

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

小提示:

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



    4.0.0

    com.bjsxt
    projectparent
    1.0-SNAPSHOT

    
    
        
        8.0.27
    

    
    
        
            
                mysql
                mysql-connector-java
                
                ${mysql-version}
            
        
    








4. 聚合关系

4.1 聚合关系说明

聚合关系的前提:继承。

聚合主要用在后面的分布式架构或微服务架构的项目,对于目前的单体架构项目来说很少使用聚合项目。

聚合项目最大的好处:在一个父项目中创建多个模块,所有的模块都是独立的,可以独立运行。且父项目不需要install,子模块就可以继承父项目的pom中的依赖。

4.2 聚合项目演示
4.2.1 新建普通Maven项目

示例中项目名称为:mavenparent。

4.2.2 创建子项目

鼠标右键点击项目 -> New -> Module...

阶段六-Day02-Maven_第51张图片

4.2.3 创建子项目过程特殊说明

创建聚合项目过程和创建普通Maven项目类似。唯一的区别是填写坐标过程中GroupID和Version是不允许修改的,必须和父项目的相同。ArtifactId根据自己的需要进行填写。

4.2.4 观察父项目

查看mavenparent中pom.xml可以发现里面有两点重要配置。

  1. 为pom。

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

阶段六-Day02-Maven_第52张图片

4.2.5 观察子项目

子项目中有继承的配置。

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

阶段六-Day02-Maven_第53张图片

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

阶段六-Day02-Maven_第54张图片

开启tomcat

访问tomcat的主页

阶段六-Day02-Maven_第55张图片

阶段六-Day02-Maven_第56张图片

阶段六-Day02-Maven_第57张图片

需要登录,这里也要设置用户名和密码

根据API页面的说明,打开Tomcat安装目录下的conf目录下的tomcat-users.xml文件,完成配置。

使用XShell操作服务器中Tomcat,配置文件所在路径: /usr/local/tomcat/conf/tomcat-users.xml

在文件中添加7行(`标签的7行),配置完成后重启Tomcat

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












重启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:为上面配置的密码




  
    org.apache.tomcat.maven
    tomcat7-maven-plugin
    2.2
    
      
      http://192.168.8.129:8080/manager/text
      admin
      admin
      /project
    
  

3.5 部署项目

配置好后在Maven面板,找到项目下的Plugins,选择tomcat:deploy即可进行远程部署,如果服务器中已经存在这个项目,再次运行会报错。

建议直接点击tomcat7:redeploy进行第一次或第N次部署。

十二、Maven命令和项目生命周期

1. 常用命令

除了可以像今天最开始那样在命令行工具输出Maven命令,也可以在IDEA中输入命令。

选择Maven面板中命令按钮,图标为m

阶段六-Day02-Maven_第58张图片

点击后弹出命令界面,可以在里面输入命令。Maven所有命令都是以mvn开头的。

阶段六-Day02-Maven_第59张图片

常用指令:

常用指令 指令含义
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 生成站点。但是需要添加插件才能使用。

 站点插件


    
        
                org.apache.maven.plugins
                maven-project-info-reports-plugin
                2.7
        
    

2. Maven项目生命周期(面试题)

Maven有三套相互独立的生命周期(Lifecycle ):

  • Clean Lifecycle:做一些清理工作;

  • Default Lifecycle:构建的核心部分、编译、测试、打包、部署等;

  • Site Lifecycle:生成项目报告、站点、发布站点;

其中Default Lifecycle包含如下阶段:

  • validate - 验证项目是否正确并且所有必要的信息都可用

  • compile - 编译项目的源代码

  • test- 使用合适的单元测试框架测试编译的源代码。这些测试不应该要求打包或部署代码

  • package - 将编译后的代码打包成可分发的格式,例如 JAR。

  • verify - 对集成测试的结果进行任何检查,以确保满足质量标准

  • install - 将包安装到本地存储库中,作为本地其他项目的依赖项

  • deploy - 在构建环境中完成,将最终包复制到远程存储库以与其他开发人员和项目共享

阶段六-Day02-Maven_第60张图片

生命周期的每个阶段必须按照严格的执行顺序,当然我们可以执行任意一个阶段,但是每个阶段都会从第一个阶段开始执行。可以通过maven的命令来执行每个阶段的操作,也可以使用Maven和IDEA集成后提供的图形界面来完成操作,通过图形界面相对比较简单,直接选择相对应的阶段双击运行即可。

运行的时候都会从头开始运行

阶段六-Day02-Maven_第61张图片

十三、单元测试

1. 单元测试介绍

单元测试:独立运行项目中某个或某些方法。

Java中常见的单元测试工具:Junit

在Maven项目中src/main/test包是专门编写单元测试的包。

2. 单元测试的使用

2.1 导入依赖

添加junit依赖

阶段六-Day02-Maven_第62张图片

2.2 编写测试类

在src/main/test下新建任意类,类名不能叫做Test。

在类中提供任意方法,方法上添加@Test注解,双击方法名后,鼠标右键点击Run 方法名,运行方法。

在Junit除了@Test还提供了@Before和@After,分别代表在运行@Test方法之前和之后运行的方法。

/*
单元测试:
    正常情况下,项目应该有一个主方法,通过运行主方法所在类,让整个项目运行起来。

    在项目规格比较大的情况下,如果希望只测试其中某个方法,单独运行一个方法,这时就叫单元测试。
    junit单元适用于非web环境。
 */
public class MyTest {
    /*
    适用于只需要在方法上添加@Test注解。

     */
    @Test
    public void test(){
        System.out.println("test");
    }
    /*
    要求方法必须是public void的,如果不是会出现运行时异常。
     */
    @Test
    public void test123(){
        System.out.println("test2");
    }

    @Before
    public void isbefore(){
        System.out.println("before");
    }
    @After
    public void after(){
        System.out.println("after");
    }
}

十四、scope(面试题)

1. scope介绍

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

scope可取值:

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

2. 使用方式

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


    
        junit
        junit
        4.13.2
        test
    

十五、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,表示只在编译时生效。


    
        javax.servlet
        javax.servlet-api
        4.0.1
        provided
    
    
        javax.servlet.jsp
        javax.servlet.jsp-api
        2.3.3
        provided
    

你可能感兴趣的:(java学习之路,maven,java)