自动化构建工具 Maven

哔哩哔哩尚硅谷 Maven-Eclipse版 学习视频网址
文章只为分享学习经验和自己复习用,学习还是去查看正规视频网站和官方文档更有效

解释 归属 备注
pom.xml Maven核心配置文件 文件
resources 资源,存放框架或其他工具 文件
<groupId> 项目组ID pom.mxl 官网倒序
<artifactId> 项目的模块ID pom.mxl
<version> 模块版本号 pom.mxl
<dependency> 依赖信息 pom.mxl
<type> 依赖类型 pom.mxl
<scope> 依赖范围 pom.mxl
mvn clean 清理 Maven命令
mvn compile 编译主程序 Maven命令
mvn test-compile 编译测试程序 Maven命令
mvn test 执行测试 Maven命令
mvn package 打包 Maven命令 执行下面,上面的也会执行
mvn install 安装 Maven命令 安装才会存入本地仓库
mvn site 生产站点 Maven命令
compile 编译 依赖范围 全能使用,并且保存
test 测试 依赖范围 只测试使用,不保存
provided 假如 依赖范围 全能使用,但是不保存
Clean 清理 依赖生命周期
Site 位置 依赖生命周期
Default 默认 依赖生命周期
<exclusion> 依赖排除 pom.mxl
<properties> 性质 pom.mxl 统一版本号
<parent> 继承 继承pom.mxl 子类声明
<relativePath> 相对路径 继承pom.mxl 子类中的父类路径
<dependencyManagement> 依赖关系管理 继承pom.mxl 父类统一配置子类依赖
<module> 聚合 pom.mxl 一键安装各个模块
<build> 部署 pom.mxl 已经不太适用

目录

  • 自动化构建工具 Maven
    • 1、标准技术
    • 2、这些技术在开发中存在的问题 [Why]
    • 3、Maven是什么?[what]
      • 3.1、Maven是一款服务于Java平台的自动化构建工具
      • 3.2、构建
      • 3.3、构建过程中的各个环节
      • 3.4、自动化构建
    • 4、安装 Maven 核心程序
      • 4.1、检查JAVA_HOME环境变量
      • 4.2、Maven核心程序的压缩包
      • 4.3、配置Maven相关的环境变量
      • 4.4、验证:运行 mvn -v 命令查看Maven版本
      • 4.5、Maven的核心概念
      • 4.6、创建第一个Maven工程
        • 1、 创建约定的目录结构(强制性)
        • 2、为什么要遵守约定的目录结构呢?
      • 4.7、常用Maven命令
        • 1、创建测试目录
        • 2、基本的Maven命令
      • 4.8、关于联网问题和修改默认本地仓库
      • 4.9、POM
      • 4.10、坐标
      • 4.11、仓库
      • 4.12、依赖,创建第二个Maven工程
        • 4.12.1、创建第二个Maven工程
        • 4.12.2、依赖(初级)
        • 4.12.3、依赖的范围
          • 1、compile范围依赖
          • 2、test范围依赖
          • 3、provided范围依赖
      • 4.13、生命周期
        • 4.13.1、Clean 生命周期
        • 4.13.2、Site 生命周期
        • 4.13.3、Default 生命周期
      • 4.14、在Eclipse中使用Maven
        • 4.14.1、Maven插件:Eclipse内置
        • 4.14.2、Maven插件的设置
        • 4.14.3、基本操作
          • 1、创建Maven版的Java工程
          • 2、创建Maven版的Web工程
          • 3、创建index.jsp
          • 4、执行Maven命令
          • 5、jsp-api---依赖范围导致jar包冲突
          • 6、导入手动创建的maven工程
        • 4.14.4、创建第三个Maven工程
      • 4.15、依赖(高级)
        • 4.15.1、依赖的传递性
        • 4.15.2、依赖的排除
        • 4.15.3、依赖的原则
        • 4.15.4、统一管理依赖的版本
      • 4.16、继承
      • 4.17、聚合
      • 4.18、部署deploy
    • 5、Maven-jar依赖信息网站
    • 6、Maven---Eclipse常见报错
      • 1、创建index.jsp红叉(缺少jar包报错)
      • 2、pom.xml第一条红叉(无法初始化类错误)
      • 3、Maven项目红叉(Maven项目不是最新错误)
      • 4、pom.xml--war红叉(web.xml丢失错误解决方法)

Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。读音是['meɪv(ə)n]或['mevn]。

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。

Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。

1、标准技术

2、这些技术在开发中存在的问题 [Why]

  1. 一个项目就是一个工程

    • 如果项目非常庞大,就不适合继续使用package来划分模块。最好是每个模块对应一个工程,利于分工协作。
    • 借助于Maven就可以将一个项目拆分成多个工程。
  2. 项目中需要的jar包必须手动 “复制” 、“粘贴” 到 WEB-INF/lib 目录下
    • 带来的问题是:同样的jar包文件会重复出现在不同的项目工程中,一方面浪费存储空间,另外也让工程比较臃肿。
    • 借助Maven,可以将jar包仅仅保存在 “仓库” 中,有需要使用的工程 “引用” 这个文件接口,并不需要真的把jar包复制过来。
  3. jar包需要别人替我们准备好,或到官网下载
    • 不同技术的官网提供jar包下载的形式是五花八门的。
    • 有些技术的官网就是通过Maven或SVN等专门的工具来提供下载。
    • 如果是以不规范的方式下载的jar包,那么其中的内容很可能也是不规范的。
    • 借助于Maven可以以一种规范的方式下载jar包。因为所有知名框架或第三方工具的jar包以及按照统一的规范存放在Maven的中央仓库中。(以规范的方式下载jar包,内容也是可靠的)
    • Tips:“统一的规范” 不仅是对IT开发领域非常重要,对于整个人类社会都是非常重要的。
  4. 一个jar包依赖的其他jar包,也需要自己手动加入到项目中
    • File Upload 组件 → IO 组件,commons-fileupload-1.3.jar 依赖于 commons-io-2.0.1.jar。一个正规工程需要大量的jar包以及它的关联jar包。
    • 如果所有jar包之间的依赖关系都需要程序员自己非常清楚的了解,那么就会极大的增加学习成本。
    • Maven会自动将被依赖的jar包导入进来。

3、Maven是什么?[what]

3.1、Maven是一款服务于Java平台的自动化构建工具

Make → Ant → Maven → Gradle

3.2、构建

构建并不是创建,创建一个工程并不等于构建一个项目。

要了解构建的含义我们应该由浅入深的从以下三个层面来看:

1、纯 Java 代码
大家都知道,我们 Java 是一门编译型语言,.java 扩展名的源文件需要编译成.class 扩展名的字节码文件才能够执行。所以编写任何 Java 代码想要执行的话就必须经过编译得到对应的.class 文件。

2、Web 工程
当我们需要通过浏览器访问 Java 程序时就必须将包含 Java 程序的 Web 工程编译的结果“拿”到服务
器上的指定目录下,并启动服务器才行。这个“拿”的过程我们叫部署。

3、实际项目
在实际项目中整合第三方框架,Web 工程中除了 Java 程序和 JSP 页面、图片等静态资源之外,还包括第三方框架的 jar 包以及各种各样的配置文件。所有这些资源都必须按照正确的目录结构部署到服务器上,项目才可以运行。

  • 概念:以 “Java源文件”、“框架配置文件”、”JSP“、”HTML“、”图片“ 等资源为 ”原材料“,去 ”生产“ 一个可以运行的项目的过程

    • 编译
    • 部署
    • 搭建
  • 编译:Java源文件[User.java] → 编译 → Class字节码文件[User.class] → 交给JVM去执行

    Tips:运行时环境

​ 其实是一组jar包的引用,并没有把jar包本身复制到工程中,所以并不是目录

  • 部署:一个BS项目最终运行的并不是动态Web工程本身,而是这个动态Web工程 “编译的结果”

“ 编译的结果 ”

生的鸡 → 处理 → 熟的鸡

动态Web工程 → 编译、部署 → 编译结果

  • 编译结果和工程本身是不一样的

相对路径在没有输入/WebContent时也能正确跳转,是由于程序真正运行的是编译结果

根目录名为工程名字,里面没有WebContent目录,WebContent目录的内容已经变成了编译结果的主体内容,包括/good

所以开发过程中,所有的路径或配置文件中配置的类路径等都是以编译结果的目录结构为标准的

Tips:tc_sever 可以查看项目目录

​ 整个目录复制到eclipse解压安装目录下的dropins目录下即可

实际使用中IDEA和Eclipse已经帮助我们进行了构建与部署,所有体验不是很明显

eclipse自动编译(构建)

3.3、构建过程中的各个环节

  1. 清理:将以前编译得到旧class字节码文件删除,为下一次编译做准备
  2. 编译:将Java源程序编译成class字节码文件
  3. 测试:自动测试,自动调用junit程序
  4. 报告:测试程序执行的结果
  5. 打包:动态Web工程war包,Java工程打jar包
  6. 安装:Maven特定的概念——将打包得到的文件复制到 “仓库” 中的指定位置
  7. 部署:将动态Web工程生成的war包复制到Servlet容器的指定目录下,使其可以运行

3.4、自动化构建

由于它环节比较多,如果只是人工去操作就比较费劲,所以自动化构建尤其重要

一个正常的修复BUG流程

我们发现中间红色的步骤是重复的

如果将重复的步骤交给自动构建就可以省很多步骤

此时 Maven 的意义就体现出来,它可以自动的从构建过程的起点一致执行到终点

4、安装 Maven 核心程序

4.1、检查JAVA_HOME环境变量

C:\Users\Administrator>echo %JAVA_HOME%
G:\java\jdk

4.2、Maven核心程序的压缩包

解压Maven核心程序的压缩包,放在一个非中文无空格路径下

D:\Environment\apache-maven-3.8.1

4.3、配置Maven相关的环境变量

​ (1)MAVEN_HOME或M2_HOME

​ (2)path

4.4、验证:运行 mvn -v 命令查看Maven版本

C:\Users\Administrator>mvn -v Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d) Maven home: D:\Environment\apache-maven-3.8.1\bin\.. Java version: 1.8.0_231, vendor: Oracle Corporation, runtime: G:\java\jdk\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

4.5、Maven的核心概念

  1. 约定的目录结构
  2. POM
  3. 坐标
  4. 依赖
  5. 仓库
  6. 生命周期/插件/目标
  7. 继承
  8. 聚合

4.6、创建第一个Maven工程

1、 创建约定的目录结构(强制性)

Hello
|—src
|—|---main
|—|---|—java
|—|---|—resources
|—|---test
|—|---|—java
|—|---|—resources
|—pom.xml

  1. 根目录:工程名
  2. src目录:源码
  3. pom.xml文件:Maven工程的核心配置文件
  4. test目录:存放测试程序
  5. java目录:存放Java源文件
  6. resources目录:存放框架或其他工具的配置文件

2、为什么要遵守约定的目录结构呢?

  • Maven要负责我们这个项目的自动化构建,以编译为例,Maven要想自动化编译,那么它必须知道Java源文件保存在哪里

    • 以配置的方式明确告诉框架
    <context-param><param-name>contextConfigLocation</param-name><param-value>classspath:spring-context.xml</param-value>
    </context-param>
    
    • 遵守框架内部已经存在的约定

      log4j.properties

      log4j.xml

  • 约定 > 配置 > 编码

4.7、常用Maven命令

1、创建测试目录

创建约定目录

按约定创建

Hello
|—src
|—|---main
|—|---|—java
|—|---|—resources
|—|---test
|—|---|—java
|—|---|—resources
|—pom.xml

POM.xml文件内容

<?xml version="1.0" ?>
<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.atguigu.maven</groupId><artifactId>Hello</artifactId><version>0.0.1-SNAPSHOT</version>     <!-- 坐标,唯一的标识 --><name>Hello</name>                        <!-- 工程名字 --><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.0</version><scope>test</scope></dependency></dependencies>                            <!-- 它所依赖的其他jar,junit -->
</project>

编写主程序diam

编写主程序代码
在src/main/java/com/atguigu/maven目录下新建文件Hello.java,内容如下

        package com.atguigu.maven;public class Hello {public String sayHello(String name){return "Hello "+name+"!";}}

编写测试代码

在/src/test/java/com/atguigu/maven目录下新建测试文件HelloTest.java

     package com.atguigu.maven;  import org.junit.Test;import static junit.framework.Assert.*;public class HelloTest {@Testpublic void testHello(){Hello hello = new Hello();String results = hello.sayHello("litingwei");assertEquals("Hello litingwei!",results);   //assertEquals 断言,断言results 和内容一样,不然抛异常}}

2、基本的Maven命令

(1)注意:执行与构建过程相关的Maven命令,必须进入pom.xml所在的目录。与构建过程相关:编译、测试、打包、…

(2)常用命令

  1. mvn clean:清理

  2. mvn compile:编译主程序

    生成target文件→classes和maven-status文件

  3. mvn test-compile:编译测试程序

  4. mvn test:执行测试

  5. mvn package:打包(只会打包主程序)

    target文件中出现→maven-archiver、surefire-reports(测试报告)、test-classes、Hello-0.0.1-SNAPSHOT.jar(只有主程序,没有测试程序)

  6. mvn install:安装

  7. mvn site:生成站点

执行各个构建环节都是有顺序的,当你执行 “打包” 的时候,也会执行 “测试”

4.8、关于联网问题和修改默认本地仓库

1、Maven的核心程序中仅仅定义了抽象的生命周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven得核心程序中

2、当我们执行的Maven命令需要用到某些插件时,Maven核心程序会首先到本地仓库中查找

3、本地仓库的默认位置:[系统中当前用户的家目录]\.m2\repository

C:\Users\[登录当前系统的用户名]\.m2\repository

4、Maven核心程序如果在本地仓库中找不到需要的插件,那么它会自动连接外网,到中央仓库下载

5、如果此时无法连接外网,则构建失败

6、修改默认本地仓库的位置可以让Maven核心程序到我们事先准备好的目录下查找插件

  1. 找到Maven解压目录\conf\settings.xml
  2. 在settings.xml文件中找到localRepository标签
  3. <localRepository>/path/to/local/repo</localRepository>从注释中取出
  4. 将标签体内容修改为已经准备好的Maven仓库目录

4.9、POM

  1. 含义:Project Object Model 项目对象模型

  2. pom.xml 对于Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。

    重要程度相当于web.xml对于动态Web工程

4.10、坐标

1、数学中的坐标

(1)在一个平面中使用 x、y 两个向量可以唯一的确定平面中的一个点。

(2)在空间中使用 x、y、z 三个向量可以唯一的确定空间中的一个点。
2、Maven 的坐标

使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程。

GAV

(1)groupid:公司或组织的域名倒序+当前项目名称

<groupid>com.ssxxz.maven</groupid>

(2)artifactId:当前项目的模块名称

<artifactId>Hello</artifactId>

(3)version:当前模块的版本

<version>1.0.0</version>

SNAPSHOT表示一个不稳定的更新速度很快,临时的一个

RELEASE分离,表示这个工程已经彻底分离了,一个完整稳定的版本

3、Maven工程的坐标与仓库中路径的对应关系

Maven工程

  <modelVersion>4.0.0</modelVersion><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.0.0.RELEASE</version>

仓库中路径

org\springframework\spring-core\4.0.0.RELEASE\spring-core-4.0.0.RELEASE.jar

4.11、仓库

1、仓库的分类

  1. 仓库的分类

    • 本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务

    • 远程仓库:

      • 私服(局域网):架设在当前局域网环境下,为当前局域网范围内的所有 Maven 工程服务

      • 中央仓库:架设在 Internet 上,为全世界所有 Maven 工程服务

      • 中央仓库镜像:架设在各个大洲,为中央仓库分担流量。减轻中央仓库的压力,同时更快的响应用户请求

  1. 仓库中保存的内容:Maven工程

    • Maven自身所需要的插件
    • 第三方构架和工具的jar包
    • 我们自己开发的Maven工程

4.12、依赖,创建第二个Maven工程

4.12.1、创建第二个Maven工程

1、工程名:HelloFriend

2、目录结构与第一个Maven工程相同

3、POM文件

<?xml version="1.0" ?>
<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.atguigu.maven</groupId><artifactId>HelloFriend</artifactId><version>0.0.1-SNAPSHOT</version><name>HelloFriend</name><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.0</version><scope>test</scope></dependency>      <dependency><groupId>com.atguigu.maven</groupId><artifactId>Hello</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency></dependencies>
</project>

注意:已经依赖了 Hello,是否可以使用?

4、主程序:在src/main/java/com/atguigu/maven目录下新建文件HelloFriend.java

它调用了 Hello() 方法

package com.atguigu.maven;   import com.atguigu.maven.Hello;public class HelloFriend {public String sayHelloToFriend(String name){Hello hello = new Hello();String str = hello.sayHello(name)+" I am "+this.getMyName();System.out.println(str);return str;}public String getMyName(){return "John";}}

5、测试程序:在/src/test/java/com/atguigu/maven目录下新建测试文件HelloFriendTest.java

package com.atguigu.maven;   import static junit.framework.Assert.assertEquals;import org.junit.Test;import com.atguigu.maven.Hello;public class HelloFriendTest {@Testpublic void testHelloFriend(){HelloFriend helloFriend = new HelloFriend();String results = helloFriend.sayHelloToFriend("litingwei");assertEquals("Hello litingwei! I am John",results);   }}

6、运行Maven命令

  • 需要进入HelloFriend目录下
  • mvn compile 编译

最后结果Hello工程无法被解析,找不到!

(是由于本地仓库com.atguigu.maven里没有Hello工程,所以找不到)

4.12.2、依赖(初级)

Maven解析依赖信息时会到本地仓库中查找依赖的jar包,没有找到Hello所以会报错。

对于我们自己开发的Maven工程里面缺失很多必要文件,所以需要使用 mvn install命令安装后才可以进入仓库。

  • 没安装前空的

  • 安装后

  • 安装Hello后,再次编译HelloFriend成功

4.12.3、依赖的范围

compile, test, provided

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Jp7AuUy-1631410147706)(Maven.assets/image-20210903211206806.png)]

主程序看不到测试程序,但是测试程序可以看到主程序

1、compile范围依赖
  • 对主程序是否有效:有效
  • 对测试程序是否有效:有效
  • 是否参与打包:参与
  • 是否参与部署:参与
  • 是否可以传递:可以
  • 典型例子:spring-core
  • 全能使用,并且保存
2、test范围依赖
  • 对主程序是否有效:无效
  • 对测试程序是否有效:有效
  • 是否参与打包:不参与
  • 是否参与部署:不参与
  • 是否可以传递:不可以
  • 典型例子:junit
  • 只测试使用,不保存
3、provided范围依赖
  • 对主程序是否有效:有效
  • 对测试程序是否有效:有效
  • 是否参与打包:不参与
  • 是否参与部署:不参与
  • 是否可以传递:不可以
  • 典型例子:servlet-api.jar
  • 全能使用,但是不保存

provided部署运行的时候就会被忽略

强行部署会产生冲突

4.13、生命周期

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

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

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

  4. 插件和目标

    • 生命周期的各个阶段仅仅定义了要执行的任务是什么?

    • 各个阶段和插件的目标是对应的。

    • 相似的目标由特定的插件来完成。

      生命周期阶段 插件目标 插件
      compile compile maven-compile-plugin
      test-compile testcompile maven-compile-plugin
    • 可以将目标看作 ”调用插件功能的命令“

Maven 有三套相互独立的生命周期,分别是:

  • Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
  • Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
  • Site Lifecycle 生成项目报告,站点,发布站点。

它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。

每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。

比如,运行 mvn clean,这个 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段。

4.13.1、Clean 生命周期

Clean 生命周期一共包含了三个阶段:

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

4.13.2、Site 生命周期

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

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

4.13.3、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:将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。

4.14、在Eclipse中使用Maven

4.14.1、Maven插件:Eclipse内置

4.14.2、Maven插件的设置

  • installations:指定Maven核心程序的位置

    • Eclipse中maven进行设置
    • Maven插件的设置
      • installations:指定Maven核心程序的位置。不建议使用插件自带的Maven程序,而应该使用我们自己解压的那个。
      • user settings:指定conf/settings.xml的位置,进而获取本地仓库的位置。

installations

user settings

4.14.3、基本操作

1、创建Maven版的Java工程

注意:默认 JDK1.5

JDK1.5 和 1.8 编程时常见差别

List<String> list = new Array<>             //1.8后一个泛型可以省略
List<String> list = new Array<String>      //1.5必须类型必须写出来,不然无法识别//会报 diamond 错误

手动修改JDK

右键

设置通过Maven创建的工程的JDK版本——一劳永逸

  • 打开settings.xml文件
  • 找到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>

不使用简单模式创建

如果不使用简单模式创建,就会让你选择各种插件,同时创建后的目录也不相同

(可能我配置有缺陷,我打开没有任何插件)

2、创建Maven版的Web工程

通过打包的方式,区分jar,war,pom

但是生成出的web和实际web工程差距很大

META-INF 和 WEB-INF 都没有

解决方案

Properties

先把√去掉

再√上会出现 Further 点击进入

修改内容,并保证 Generate… √的存在

META-INF 和 WEB-INF 就出现了

同时可能出现的6.2、6.3、6.4错误

3、创建index.jsp

但是创建 jsp 后却报错,缺失 HttpServlet

(1)在pom.xml 中添加

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu.maven</groupId><artifactId>WebProject</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><dependencies><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency></dependencies></project>

同时可能出现的(6.1)缺少Maven Dependencies错误

(2)https://blog.csdn.net/fjjfqwzcq/article/details/114372225 添加Jar包

(3)https://www.cnblogs.com/achengmu/p/8082457.html 添加库

同一个报错的三种方法

同时发现,只有compile范围的才会部署到WEB-INF→lib目录下,

     <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency>

没写范围就默认 compile 范围

         <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency>

其他都没有部署

EL表达式自动提示

需要JSPAPI依赖

     <dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1.3-b06</version><scope>provided</scope></dependency>

(但是我依赖后有自动提示,但是点击后没有反应,并且光标会跳到最后一行,无法自动补全。)

jar也进来了

4、执行Maven命令

pom.xml 右键 Run As 里选择命令

Maven build… 里可以添加命令

5、jsp-api—依赖范围导致jar包冲突
     <dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1.3-b06</version><scope>provided</scope></dependency>

当jsp-api范围为<scope>compile</scope>时,会报空指针异常。

是因为当范围为compile时,它的 jar包就会被部署在工程 lib目录中。

但是Tomcat lib目录中内也有同样的 jar包,这样就会发生冲突。

6、导入手动创建的maven工程

正常情况下的导入使用Import→Existing…

但是在eclipse读取中不认为我们自己创建的maven是eclipse工程,因为它没有这三个,所以无法导入

一般我们使用Maven导入

选择后它会自动扫描,是依据pom.xml来识别的。

导入后,这三个文件就自动加入了

4.14.4、创建第三个Maven工程

MakeFriends

package com.atguigu.maven;public class MakeFriends {public String makeFriends(String name){HelloFriend friend = new HelloFriend();friend.sayHelloToFriend("litingwei");String str = "Hey,"+friend.getMyName()+" make a friend please.";System.out.println(str);return str;}
}

MakeFriendsTest

package com.atguigu.maven;import static junit.framework.Assert.assertEquals;
import org.junit.Test;public class MakeFriendsTest {@Testpublic void testMakeFriends() {MakeFriends makeFriend = new MakeFriends();String str = makeFriend.makeFriends("litingwei");assertEquals("Hey,John make a friend please.", str);}
}

导入包可以使用eclipse导入,也可以使用Maven依赖信息导入,使用上差不多。

加入依赖信息自动导入环境

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu.maven</groupId><artifactId>MakeFriends</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency><dependency><groupId>com.atguigu.maven</groupId><artifactId>HelloFriend</artifactId><version>0.0.1-SNAPSHOT</version><type>jar</type><scope>compile</scope></dependency>  </dependencies></project>

JRE 是Eclips自带的运行时环境

Maven Dependencies就是Maven依赖的运行时环境

运行时环境不是本地仓库jar,而是jar的引用,还在它原来自定义的位置

Eclipse 和 Maven 工程识别

虽然运行环境中有HelloFriend,但是实际仓库中并没有 , HelloFriend并没有安装

但是java方法中可以调用,Maven命令时,却没法解析

这是因为eclipse里自带插件的寻找功能,可能在系统工作台找到,和maven没关系

所以当执行Maven命令时,却会因为找不到而报错

Maven主要工程前期搭建环境的时候比较复杂,但是一旦环境搭建好,后期编程的时候就一般感觉不到Maven的存在

4.15、依赖(高级)

4.15.1、依赖的传递性

在在Hello/pam.xml中添加对spring-core的依赖

     <dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.0.0.RELEASE</version><scope>compile</scope></dependency>

Hello环境里出现了spring-core的jar包和它关联的commons-logging包

同时:

HelloFriend环境里也出现了spring-core的jar包

MakeFriends也有了

这就是依赖的传递性!!

直接依赖

传递过来的,间接依赖

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

非compile范围的依赖不能传递

test 和 provided 范围不能传递,所以在各个工程模块中,如果有需要就得重复声明依赖

4.15.2、依赖的排除

需要设置依赖排除的场合

假如不希望将commons-logging包传递过来

依赖排除的设置方式

找到需要排除的ID

在继承的依赖方法中,加入排除公式<exclusion>

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu.maven</groupId><artifactId>MakeFriends</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency><dependency><groupId>com.atguigu.maven</groupId><artifactId>HelloFriend</artifactId><version>0.0.1-SNAPSHOT</version><type>jar</type><scope>compile</scope><exclusions><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency>  </dependencies></project>

已经被排除了

同时它的下面的工程也传递不到该jar包

4.15.3、依赖的原则

1、作用:解决模块工程之间的jar包冲突问题

2、验证路径最短者优先原则

3、验证路径相同时,先声明者优先

先声明指的是 dependency标签的声明顺序

4.15.4、统一管理依赖的版本

举例1

这里对Spring各个jar包的依赖版本都是4.0.0

如果需要统一升级为4.1.1,怎么办?手动逐一修改不可靠

建议配置方法

  1. 使用properties标签内使用自定义标签统一声明版本号

    <properties><atgugigu.spring.version>4.0.0.RELLEASE</atgugigu.spring.version>
    </properties>
    
  2. 在需要统一版本的位置,使用**${自定义标签名}**引用声明的版本号

    <dependency><groupId>org.springframework</groupId><artifactId>spring-wed</artifactId><version>${atgugigu.spring.version}</version>
    </dependency>
    

    这样只需要修改properties标签内版本号就可以

  3. 其实properties标签配合自定义标签声明数据的配置并不是只能用于声明依赖的版本号。

    凡是需要统一声明后再引用的场合都可以使用

    <properties><atgugigu.spring.version>4.0.0.RELLEASE</atgugigu.spring.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><aa.bb.cc>www</aa.bb.cc>
    </properties>
    

4.16、继承

<parent>

1、现状

​ Hello依赖的junit:4.0

​ HelloFriend依赖的junit:4.0

​ MakeFriend依赖的junit:4.9

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

2、需求:统一管理各个模块工程中对junit依赖版本

3、解决思路:将junit依赖版本统一提取到 “父” 工程中,再在子工程中声明junit依赖时不指定版本,以父工程中统一设定的为准,同时也便于修改。

4、操作步骤:

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

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu.maven</groupId><artifactId>Parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging>
</project>
  1. 在子工程中声明对父工程的引用

      <!-- 子工程中声明父工程 --><parent><groupId>com.atguigu.maven</groupId><artifactId>Parent</artifactId><version>0.0.1-SNAPSHOT</version><!-- 以当前工程的pom.xml文件为基础的父工程pom.xml文件的相对路径 --><relativePath>../Parent/pom.xml</relativePath></parent>
    
  2. 将子工程的坐标中与父工程坐标中重复的内容删除

  1. 在父工程中统一junit的依赖

    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu.maven</groupId><artifactId>Parent</artifactId><version>0.0.1-SNAPSHOT</version><packaging>pom</packaging><!-- 配置依赖的管理 --><dependencyManagement><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency></dependencies></dependencyManagement></project>
    
  2. 在子工程中删除junit依赖的版本号部分

如果需要重写,就保留

注意:配置继承后,执行安装时先安装父工程

4.17、聚合

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

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

任何工程都可以做聚合,但大部分情况下是在父工程中做聚合<module>

  <!-- 配置聚合 --><modules><!-- 指定各个子工程的相对路径 --><module>../Hello</module><module>../HelloFriend</module><module>../MakeFriends</module></modules>

它会自己比对子工程间的关系,即使顺序不对也会正确安装

3、使用方法:在聚合工程的pom.xml上点右键→run as→maven install

4.18、部署deploy

Maven自动化部署一般来说不使用,该功能步骤比较繁琐已过时,现阶段的IDEA已经可以很好的完成部署任务。

pom.xml加入<build>

 <!-- 配置当前工程构建过程中的特殊设置 --><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>

其实这个命令不适合在eclipse里面使用,适合在命令行中使用。

在eclipse里面启动deploy会导致乱码,和无法关闭的情况发生。

5、Maven-jar依赖信息网站

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

6、Maven—Eclipse常见报错

1、创建index.jsp红叉(缺少jar包报错)

The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

正常只需要导入Maven依赖即可

  <dependencies><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency></dependencies>

但是有的工程中会缺少Maven Dependencies文件,不自动下载jar包

解决方案

搜到的解决方案

在工程目录的.classpath文件中加入<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"/>

加入后确实会出现Maven Dependencies文件

但是可能如果会报错:生成路径包含重复条目

Build path contains duplicate entry: 'org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER' for project 'WebProject'

是因为这个文件下面有这条内容

但是为什么有该内容却没有Maven Dependencies文件呢?现在我还没有搞懂,但是删除刚才添加的信息后,报错会取消,同时Maven Dependencies文件也可以正常使用。

有的时候即使导入后任然红叉,就是用右键Maven→Update Project→√报错的项→ok,就可以解决

2、pom.xml第一条红叉(无法初始化类错误)

Could not initialize class org.apache.maven.plugin.war.util.WebappStructureSerializer
加入该条信息

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu.maven</groupId><artifactId>WebProject</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-war-plugin</artifactId><version>3.3.1</version></plugin></plugins></build>
</project>
  • 解决方案1

  • 解决方案2

3、Maven项目红叉(Maven项目不是最新错误)

Description Resource Path Location Type Project configuration is not up-to-date with pom.xml. Select: Maven->Update Project... from the project context menu or use Quick Fix. WebProject line 1 Maven Configuration Problem

右键Maven→Update Project→√报错的项→ok

  • 解决方案1
  • 解决方案2

4、pom.xml–war红叉(web.xml丢失错误解决方法)

web.xml is missing and <failOnMissingWebXml> is set to true

右键选择Java EE Tools 选择 Generate… 点击

同时有可能是因为web.xml报错所引起,将此处java改成大写JAVA就可以解决

Maven---尚硅谷学习笔记Eclipse版相关推荐

  1. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

  2. B站MySQL(尚硅谷)学习笔记

    B站MySQL基础(尚硅谷)学习笔记 最近在学习数据库技术,并且把视频中的知识点进行了汇总,字数较多,仅供参考. 会持续更新 欢迎读者提出问题与错误,一起交流~ 视频前几集所讲述的基本知识: DB:数 ...

  3. SpringBoot(尚硅谷学习笔记)

    1.SpringBoot优点(官网 spring.io) Create stand-alone Spring applications 创建独立Spring应用 Embed Tomcat, Jetty ...

  4. Nginx尚硅谷学习笔记

    Nginx 1.Nginx是什么 1.1 反向代理 1.2 负载均衡 1.3 动静分离 2. niginx安装.常用命令和配置文件 2.1 linux系统中安装nginx 2.2 nginx常用命令 ...

  5. 8-zookeeper算法基础(尚硅谷学习笔记)

    目录 拜占庭将军问题 paxos算法 paxos算法流程 情况一 情况二 情况1 情况2 ZAB协议 ZAB协议内容 消息广播 过程 可能出现的问题 崩溃恢复 异常假设 leader选举 数据恢复 C ...

  6. 尚硅谷学习笔记-节点的常用属性和方法

    节点的常用属性和方法[图片在末尾] 方法: 通过具体的元素节点调用 getElementsByTagName() 方法,获取当前节点的指定标签名孩子节点 appendChild( oChildNode ...

  7. [React] 尚硅谷 -- 学习笔记(七)

    第七章 react-ui 最流行的开源React UI组件库 material-ui(国外) 官网 GitHub ant-design(国内蚂蚁金服) PC官网 GitHub 移动官网 GitHub ...

  8. [React] 尚硅谷 -- 学习笔记(六)

    第六章 react-router4 理解 react-router react的一个插件库 专门用来实现一个SPA应用 基于react的项目基本都会用到此库 SPA 单页Web应用(single pa ...

  9. [React] 尚硅谷 -- 学习笔记(五)

    第五章 总结 组件间通信 通过props传递 共同的数据放在父组件上, 特有的数据放在自己组件内部(state) 通过props可以传递一般数据和函数数据, 只能一层一层传递 一般数据–>父组件 ...

最新文章

  1. Java swing 如何将一个按钮放置到弹出框框的任意位置?(Absolute layout 布局的使用)...
  2. Python检查系统可疑用户
  3. 探访物联网安全新边界 文印保护成思维盲区
  4. 《当程序员的那些狗日日子》(三十四)人事变动
  5. 红魔1android版本能升到多少,红魔5G:实力全开,比快更快
  6. Problem b(BZOJ-2301/HAOI-2011)
  7. Android Navigation 组件(基础篇)
  8. java抽象类的字段_java打印出继承体系的类(包括抽象类)、接口、域字段
  9. Vue源码分析 - compile.js
  10. navicat 导入excel 闪退
  11. 读书笔记2014第12本:《创新者的窘境》
  12. Booth算法乘法器
  13. 暮光之城破晓 - 看看会发生什么
  14. win7电脑变身WiFi热点
  15. echart地图飞线图
  16. 王者荣耀是如何从C++代码变到游戏的?
  17. 电声乐器的演奏特征与制作技巧-----(3)吉他篇
  18. Power Query 自学教程
  19. 斑马无线打印服务器,斑马打印机网络中文打印实例(亲测可用)
  20. Python之微信自动化

热门文章

  1. [bzoj] 1597 土地购买 || 斜率优化dp
  2. IDEA Intellij小技巧和插件
  3. 只需两分钟,如何下载b站高清封面图片
  4. 201226元件_看电阻型号
  5. Python_pgzero小球抛物线运动
  6. 人在职场:可以让你少奋斗10年的工作经验
  7. 特殊符号备用——三角形
  8. Silverlight 教程第二部分:使用布局管理 (木野狐译) 1
  9. 分治法 divide and conquer
  10. 生鲜配送公司面临的几大痛点,你知道多少?