Maven学习笔记__下篇

Maven学习笔记__下篇

本文档基于 尚硅谷视频教程 整理,仅用于个人学习/交流使用。

视频链接:https://www.bilibili.com/video/BV1TW411g7hP

官方资料:链接:https://pan.baidu.com/s/1o66CnnnX-MkoLa3z56joew 提取码:8uws

参考博客:https://blog.csdn.net/zxm1306192988/article/details/76209062

Maven学习笔记__上篇:https://blog.csdn.net/A233666/article/details/112852096

Maven学习笔记__下篇:https://blog.csdn.net/A233666/article/details/112852129

12、依赖【初步】

  1. 依赖管理,我们只需要解决一下几个问题:

    ①依赖的目的是什么

    当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。那么如何在项目 中以依赖的方式引入一个我们需要的 jar 包呢?

    答案非常简单,就是使用 dependency 标签指定被依赖 jar 包的坐标就可以了。

    image-20210119115214607

    对于我们自己开发的Maven工程,要使用mvn install 命令安装后就可以进入仓库。

  2. 依赖的范围

    大家注意到上面的依赖信息中除了目标 jar 包的坐标还有一个 scope 设置,这是依赖的范围。依赖的范围有几个可选值,我们用得到的是:compile、test、provided三个。

    ①从项目结构角度理解compile和test的区别

    image-20210119113758956

    compile范围依赖

    对主程序是否有效:有效
    对测试程序是否有效:有效
    是否参与打包:参与
    是否参与部署:参与
    典型例子:spring-core

    test范围依赖

    对主程序是否有效:无效
    对测试程序是否有效:有效
    是否参与打包:不参与
    是否参与部署:不参与
    典型例子:Junit

    image-20210119114001526

    ②从开发和运行这两个阶段理解compile 和 provided 的区别

    image-20210119114325355

    对主程序是否有效:有效
    对测试程序是否有效:有效
    是否参与打包:不参与
    是否参与部署:不参与
    典型例子:Servlet-api.jar

    ③有效性总结

    image-20210119115401061

13、生命周期

  1. 各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行。

  2. Maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。

  3. Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期中各个阶段:不论现在要执行生命周期中的哪一阶段,都是从这个生命周期最初的位置开始执行

  4. 生命周期与自动化构建

    运行任何一个阶段的时候,它前面的所有阶段都会被运行,例如我们运行 mvn install 的时候,代码会 被编译,测试,打包。这就是 Maven 为什么能够自动执行构建过程的各个环节的原因。此外,Maven 的插 件机制是完全依赖 Maven 的生命周期的,因此理解生命周期至关重要。

    执行实例:

    image-20210119114556830
  5. Maven有三套相互独立的生命周期,分别是:

    ①Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

    ②Default Lifecycle 构建的核心部分,编译、测试、打包、安装、部署等等。

    ③Site Lifecycle 生成项目报告,站点,发布站点。

    他们相互独立。也可以直接运行 mvn clean install site 运行所有这三套生命周期。

    每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行 mvn clean,这个 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段。

    Clean生命周期

    ①pre-clean 执行一些需要在clean之前完成的工作
    ②clean 移除所有上一次构建生成的文件
    ③post-clean 执行一些需要在clean 之后立刻完成的工作

    Site生命周期

    ①pre-site 执行一些需要在生成站点文档之前完成的工作
    ②site 生成项目的站点文档
    ③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
    ④site-deploy 将生成的站点文档部署到特定的服务器上

    Default生命周期

    • Default 生命周期是 Maven 生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段:
    • validate
      generate-sources
      process-sources
      generate-resources
      process-resources 复制并处理资源文件,至目标目录,准备打包。
      compile 编译项目的源代码。
      process-classes
      generate-test-sources
      process-test-sources
      generate-test-resources
      process-test-resources 复制并处理资源文件,至目标测试目录。
      test-compile 编译测试源代码。
      process-test-classes
      test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
      prepare-package
      package 接受编译好的代码,打包成可发布的格式,如 JAR。
      pre-integration-test
      integration-test
      post-integration-test
      verify
      install 将包安装至本地仓库,以让其它项目依赖。
      deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。

    这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这可是 Maven 相当强大的功能,Manager 比较喜欢,文档及统计数据自动生成,很好看。

14、插件和目标

● Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。

● 每个插件都能实现多个功能,每个功能就是一个插件目标。

● Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务。

例如:compile 就是插件 maven-compiler-plugin 的一个目标;pre-clean 是插件 maven-clean-plugin 的一个目标。

[1] 生命周期的各个阶段仅仅定义了要执行的任务是什么。

[2] 各个阶段和插件的目标是对应的。

[3] 相似的目标由特定的插件来完成。

[4] 可以将目标看作“调用插件功能的命令”

image-20210119114706297

15、在Eclipse中使用Maven

  1. Maven插件Eclipse已经内置。

  2. Maven插件的设置: Window->Preferences->Maven

    ①installations : 指定Maven核心程序的位置。默认是插件自带的Maven程序,改为我们自己解压的那个。

    ②user settings : 指定Maven核心程序中 conf/settings.xml 文件的位置,进而获取本地仓库的位置。

  3. 基本操作

    ①创建Maven版的Java工程

    创建时勾选上 Create a simple project(skip archetype selection)

    这里写图片描述

    创建的Maven工程默认使用的是JDK1.5,打开Maven核心程序settings.xml文件,找到profiles标签,加入如下配置,即可更改

        <profile>
          <id>jdk-1.7</id>
          <activation>
              <activeByDefault>true</activeByDefault>
              <jdk>1.7</jdk>
          </activation>
          <properties>
              <maven.compiler.source>1.7</maven.compiler.source>
              <maven.compiler.target>1.7</maven.compiler.target>
              <maven.compiler.compilerVersion>1.7</maven.compiler.compilerVersion>
          </properties>
     </profile>
     123456789101112
    

    ②创建Maven版的Web工程

    1、New Maven project时,Packaging 选择 war

    这里写图片描述

    2、调整web目录结构,在项目上点右键 -> properties->Project Facets -> 把Dynamic Web Module 勾选去掉,并Apply -> 将Dynamic Web Module 重新勾选 -> 点击Further configuration available -> 修改 Content directory为src/main/webapp -> Apply 即在Maven工程上生成动态Web目录结构

    3、新建jsp文件发现报错:The superclass “javax.servlet.http.HttpServlet” was not found on the Java Build Path

    因为缺少Tomcat 运行时环境

    以Maven方式添加:

在pom.xml文件中添加

这里写图片描述

4、jsp写入EL表达式时发现报错:javax.servlet.jsp cannot be resolved to a type

将JSPAPI导入

在pom.xml文件中添加

这里写图片描述

注意:scope一定要是provided,不然jar包冲突,运行时会报空指针异常

③执行Maven命令

选中pom.xml 右键 Run As->Maven build…->Goals->输入 compile ->点击 run

16、依赖【高级】

  1. 依赖的传递性

    A依赖B,B依赖C,A能否使用C呢?要看B依赖C的范围是不是compile

    image-20210119115414848

    image-20210119204529420

    [1]好处:可以传递的依赖不必在每个模块工程中都重复声明,在“最下面”的工程中依赖一次即可。

    [2]注意∶非compile范围的依赖不能传递。所以在各个工程模块中,如果有需要就得重复声明依赖。

  2. 依赖的排除

    如果我们当前工程中引入了一个依赖是A,而A又依赖了B,那么Maven会自动将A依赖的B引入当前工程,但是个别情况下B有可能是一个不稳定版本,或对当前工程有不良影响。这时我们可以在引入A的时候将B排除。

    ①情景举例

    image-20210119204612862

    ②配置方式

    image-20210119204634357

    ③排除后的效果

    image-20210119115450494

  3. 统一管理所依赖 .jar 包的版本

    image-20210119205008992

    对同一个框架的一组jar包最好使用相同的版本。为了方便升级架构,可以将jar包的版本信息统一提取出来

    ①统一声明版本号

    <properties>
     <atguigu.spring.version>4.1.1.RELEASE</atguigu.spring.version>
    </properties>
    

    其中 atguigu.spring.version 部分是自定义标签。

    ②引用前面声明的版本号

    <dependencies>
     <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-core</artifactId>
     <version>${atguigu.spring.version}</version>
     </dependency>
    ……
    </dependencies>
    
    

    ③其他用法

    <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    
  4. 依赖的原则,解决jar包冲突

    ①路径最短者优先

    image-20210119122452353

    ②路径相同时先声明者优先

    这里“声明”的先后顺序指的是 dependency 标签配置的先后顺序。

    image-20210119122508551

17、继承

  1. 假设存在现状:

    Hello依赖的Junit:4.0
    HelloFriend依赖的Junit:4.0
    MakeFriends依赖的Junit:4.9

由于test范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致。

  1. 需求:统一管理各个模块工程中对Junit依赖的版本。

  2. 解决思路:

    将Junit依赖统一提取到“父”工程中,在子工程中声明Junit依赖是不指定版本,以父工程中统一设定的为准。同时也便于修改。

  3. 操作步骤:

    ①创建一个Maven工程作为父工程。注意:打包方式为pom

    image-20210119205053921

    ②在子工程中声明对父工程的引用

    image-20210119205109098

    ③将子工程的坐标中与父工程坐标中重复的内容删除

    image-20210119205123185

    ④在父工程中统一管理Junit的依赖

    image-20210119205137706

    ⑤在子工程中删除Junit依赖的版本号部分

    image-20210119205151778

注意:配置集成后,执行安装命令时要先安装父工程。

18、聚合

  1. 作用:一键安装各个模块工程。

  2. 配置方式:在一个“总的聚合工程”中配置各个参与聚合的模块

    image-20210119205212670

  3. 使用方式:在聚合工程的pom.xml 上点右键->run as->maven install

19、Maven_Web工程的自动部署

在pom.xml 中添加如下配置:

  <!--配置当前工程构建过程中的特殊设置   -->
  <build>
    <finalName>AtguiguWeb</finalName>
    <!-- 配置构建过程中需要使用的插件 -->
    <plugins>
        <plugin>
            <!-- cargo是一家专门从事启动Servlet容器的组织 -->
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-maven2-plugin</artifactId>
            <version>1.2.3</version>
            <!-- 针对插件进行的配置 -->
            <configuration>
                <!-- 配置当前系统中容器的位置 -->
                <container>
                    <containerId>tomcat6x</containerId>
                    <home>D:\DevInstall\apache-tomcat-6.0.39</home>
                </container>
                <configuration>
                    <type>existing</type>
                    <home>D:\DevInstall\apache-tomcat-6.0.39</home>
                    <!-- 如果Tomcat端口为默认值8080则不必设置该属性 -->
                    <properties>
                        <cargo.servlet.port>8989</cargo.servlet.port>
                    </properties>
                </configuration>
            </configuration>
            <!-- 配置插件在什么情况下执行 -->
            <executions>  
                <execution>  
                    <id>cargo-run</id>
                    <!-- 生命周期的阶段 -->  
                    <phase>install</phase>  
                    <goals>
                        <!-- 插件的目标 -->  
                        <goal>run</goal>  
                    </goals>  
                </execution>  
            </executions>
        </plugin>
     </plugins>
    </build>

执行mvn deploy 命令

20、Maven 酷站

我们可以到 http://mvnrepository.com/搜索需要的 jar 包的依赖信息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值