12.Maven核心----依赖管理
- packaging : 打包后压缩文件的扩展名,默认是jar,web应用是war。
- packaging可以不写,因为默认就是jar
pom.xml加入依赖的方式::
- 经过以上代码Maven会去本地仓库查有没有5.1.9这个版本的mysql-conncetor的jar包,如果在本地仓库中存在5.1.9这个版本的mysql-conncetor, 此时就会把这个版本的数据库绑定到这个Maven项目上。以上的mysql、mysql-conncetor、5.1.9对应的都是在本地仓库中存在的文件夹
- 以上的依赖文件如果在本地仓库中没有,那么Maven会自动去远程仓库中进行寻找。
开发人员需要使用mysql驱动---->maven首先检查本地仓库---->私服---->镜像----->中央仓库 复制代码
13.Maven核心----配置属性
14.Maven核心----构建
- Maven在进行项目的构建时, 配置信息,例如指定编译java代码使用的jdk的版本等
15. Maven核心----生命周期、常用命令、插件
- maven生命周期:就是maven构建项目的过程,清理,编译,测试,报告,打包,安装,部署
- maven的命令:maven独立使用,通过命令,完成maven的生命周期的执行。 maven可以使用命令,完成项目的清理,编译,测试等等.
- maven的插件:maven命令执行时,真正完成功能的是插件,插件就是一些jar文件, 一些类
以下是一个标准的工程约定目录结构
以下是Maven的常用命令
15.1 mvn clean (清理)命令
- 以上就是一个插件,在生命周期中的清理阶段,使用Maven命令中的mvn clean清理命令,mvn clean之后会使用以上这个插件(jar包)完成清理工作。
- 注意:清理工作是插件完成的,不是命令完成的,命令只是负责调用这些插件(jar包),插件来完成清理,编译,测试,报告,打包,安装,部署这些工作。
- mvn clean:只编译主程序下的Java文件(即mian目录下的所有Java文件,不编译test文件夹下的测试程序)
15.2 mvn compile (编译主程序)命令
- 以下这个是使用 mvn compile 命令编译主程序,所使用的插件
- 使用 mvn compile命令,会使用两个插件,完成两个操作
编译main/java/目录下的所有java 为class文件,将这些class文件存储到target/classes文件夹下。
- 编译main/java/目录下的所有java文件,将这些class文件存储到target/classes文件夹下。
- 这个插件会将src/main/resources文件夹中的文件拷贝到 target/classes的文件夹下
15.3 mvn test-compile (编译测试程序)命令
- mvn test-compile :这个命令编译test文件夹下所有的测试程序,编译好的这些测试程序会存储到target/test-classes文件夹下。
15.4 mvn test (测试程序)命令
- 重点 : 测试程序的包路径一定要和主程序的包路径一致,这样才不会报错,也就是保证这两 个文件在同一个包路径下。
- 此时可以看出test中的测试程序 与main中的主程序的路径是一样的。
- 这个是执行的test/java文件夹下的测试程序,会将测试结果全部存储到target/surefire-resports文件夹中。
- 注意 :在执行mvn test 命令时,会把测试以前的步骤重新进行一次(清理、编译主程序、编译测试程序),这是因为有 Maven生命周期的存在。所以此时需要的插件比较多。第一个编译的是main主程序,第二个编译的是test测试程序。
- 以上的这个插件是用来测试程序的。以下输出格式代表测试成功。
- 从 TESETS 以下代表的是测试结果 :
- Runing代表的是执行的测试程序的路径以及测试程序的名称。
- Maven junit testAdd代表的是该测试结果输出的信息。
- Test run : 代表的是测试程序运行时的信息。(测试数量、失败、错误、跳过、测试时间)
- Results : 代表的是这个测试程序输出的结果。(测试数量、失败、错误、跳过)
- 以下代码测试失败。此时会抛出异常,并显示测试两个,失败一个。
以下代码是测试结果:测试两个,失败了一个,会告诉你错误信息。
Failed tests:testAdd2(com.yunbocheng.TestHelloMaven): expected:<5> but was:<3> 复制代码
重点 :以上的错误信息会生成一个报告,这个报告在 target/surefire-reports文件夹下。测试的所有结果都在这个文件夹下。
讲以上的代码错修改完成,此时会显示以下运行结果。测试两个方法,且都成功。
15.5 mvn package命令(打包主程序)
- mvn package 命令,按照pom.xml配置文件把主程序打包为jar包或者war包。
- 以下是打包使用的插件,在执行这插件之前,也会使用编译、测试的插件将这个项目在执行一遍,最后由mvn package这个命令将主程序进行打包。
- jar包以及war包就相当于一个压缩文件。
- 打包传成功之后会在target目录下生成一个ch01-maven-1.0-SNAPSHOT.jar包。
- 这个jar包中信息的解释:(jar包中包含主成程序的类文件以及配置文件(pom.xml))
- Hello这个项目主程序(HelloMaven)的路径以及字节码文件。
- 里边存在一个META-INF文件夹,在文件夹下包含这个项目的pom.xml配置文件。
- 里边还有原Maven项目src/mian/resources文件夹里边的文件(config.txt配置文件)
这个配置文件是开发人员自己在mian目录下创建并书写的。
- 针对这个jar包名称的解释:
- ch01-maven : 就是该项目pom.xml配置文件中artifactId(项目模块名称参数的信息。
- 1.0-SNAPSHOT : 就是该项目pom.xml配置文件中version(版本号)参数的信息。
重点 :这个jar包含所有的东西就是原Maven项目中main目录下的所有主程序的class文件以及开发人员自己编写的配置文件。
15.6 mvn install命令(安装主程序)
- 会把本工程打包,并且按照本工程的坐标保存到本地仓库。即使把这个项目生成的jar包保存到你自定义的本机仓库或者默认仓库(.m2)中,这样其他的项目就可以使用你这个项目中的主程序方法了
- 以下是执行mvn install命令所使用的插件,在执行这个插件之前,也会使用编译、测试、打包的插件将这个项目在执行一遍,最后由mvn package这个命令将这个Maven项目生成的jar包保存到本机仓库
- 这个本机仓库的地址就是自己在Maven中自己配置的地址或者是默认地址(.m2)。
- 保存到本机仓库里的地址就是这个Maven项目中pom.xml配置文件中的坐标信息。
<groupId>com.yunbocheng</groupId> <artifactId>ch01-maven</artifactId> <version>1.0-SNAPSHOT</version> 复制代码
以上是该Maven项目中pom.xml配置文件中的坐标信息。以下是保存到本机仓库中的路径信息
C:\development\Maven\Maven-jar\com\yunbocheng\ch01-maven\1.0-SNAPSHOT\ch01-maven-1.0-SNAPSHOT.jar 复制代码
可以看出坐标信息就是保存到本机仓库的路径信息
注意 : 在groupId这个参数中的信息,每一个小数点就代表一级文件夹
com.yunbocheng代表com/yunbocheng。
16.单元测试 junit
- 单元测试(测试方法):用的是junit, junit是一个专门测试的框架(工具)。
- junit测试的内容: 测试的是类中的方法, 每一个方法都是独立测试的。
方法是测试的基本单位(单元)。 - maven借助单元测试,批量的测试你类中的大量方法是否符合预期的。
测试程序格式
17.关于 Maven项目中 pom.xml配置文件的解释
<?xml version="1.0" encoding="UTF-8"?> <project xsi:schemaLocation="http://maven.apche.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"> <modelVersion>4.0.0</modelVersion> <groupId>com.yunbocheng</groupId> <artifactId>ch01-maven</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project> 复制代码
- modelVersion : 是这个Maven的版本号,现在统一使用4.0.0这个版本
<!--这段代码表示的是该项目生成后的jar包在本机仓库中的保存路径--> <groupId>com.yunbocheng</groupId> <artifactId>ch01-maven</artifactId> <version>1.0-SNAPSHOT</version> 复制代码
<!--这段代码代表的是从外部引入进来的依赖jar包,Maven会自动寻找这个jar包,如果这个jar包在本机中存在直接拿来使用,如果不存在会自动去远程仓库中获取,并且获取到的远成jar包会在本机仓库保存一份,方便下次使用。--> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <!--<dependencies>代表的是里边有多个插件(jar包),相当于多个插件的一个大括号,所有的插件都写在这个dependencies标签中--> <!--<dependency>这个标签里包含的是这个项目中的一个插件,他写在<dependencies>这个标签的里边,会有多个<dependency>标签,每一个标签就是一个插件--> 复制代码
18.编译插件配置
- 插件可以在自己的项目中设置,最常用的是 maven 编译插件。设置项目使用的jdk版本时通过编译插件来指定。使用pom.xml配置文件中的< build >标签中设置。
- build是用来构建配置项目的。
- 控制配置 Maven构建项目的参数设置,如 :设置JDK的版本。
- 参数信息解释:
- build :构建项目参数信息。
- plugins : 配置插件,这个相当于所有插件的一个大括号,所有的插件都写在这个里面。
- plugin : 配置具体的插件,这个代表该Maven项目中的一个插件信息,还有其他的插件。
- groupId :该插件的组织名称。
- artifactId : 插件的名称。
- version : 插件的版本。
- confiruration : 配置插件的信息。
- source : 告诉Maven,我们写的代码是在jdk1.8上编译的。
- target : 我们的程序应该运行在1.8的jdk上。
18.1 配置 jdk版本的两种方式
- 第一种:使用 properties标签配置
- 第二种:使用 configuration 标签配置
19. idea中设置Maven
- 在idea中设置maven ,让idea和maven结合使用。
- idea中内置了maven ,一般不使用内置的, 因为用内置修改maven的设置不方便。
- 使用自己安装的maven, 需要覆盖idea中的默认的设置。让idea指定maven安装位置等信息
- 在idea的文件中 Setting是设置当前项目的,Other Settings是为以后新建工程起作用
- 在配置Maven的时候,这两个位置都要配置。
19.1配置Setting中的Maven
- 第一步:配置Maven
需要配置的三个地方
- Maven Home directory : maven的安装目录。
- User Settings File : 就是maven安装目录conf/setting.xml配置文件 。
- Local Repository : 本机仓库的目录位置。
- 第二步:配置运行程序
- 配置JDK的版本
- 设置一个参数信息,-DarchetypeCatalog=internal,这个参数信息的目的是为了使构建Maven项目时速度变快。
- Maven在创建项目的时候会默认连网下载一个模板文件,这个模板文件大小有7M,为了避免 不下载这个模板文件,加上这个参数信息,表示我们用的是内部的内容,不用下载。
- -DarchetypeCatalog=internal , maven项目创建时,会联网下载模版文件,比较大,使用 -DarchetypeCatalog=internal,不用下载, 创建maven项目速度快。(2019版本以后,新的就不用添加这个)
19.2 配置Other Settings
- 第一步 :找到文件下拉菜单中的 新项目管理
- 第二步 :找到新项目设置
- 第三步 : 找到Maven 和上边的配置方式一样
- 第四步 :添加jdk与参数信息
20.idea创建JavaSE项目
使用模版创建项目
- maven-archetype-quickstart : 普通的java项目
- maven-archetype-webapp : web工程
以下是使用maven-archetype-quickstart 模块构建成功后的结构目录
注意:其中 resources文件 是我们自己手动创建的,maven-archetype-quickstart模块没有提供这两个文件夹。其中APP类是模块自动生成的,如果想用别的类文件,直接把这份删除即可。
在idea中,不同的文件夹展示的形式不一样
- 源根 : 代表Java主程序的根文件夹。
- 测试源根 : 代表Java测试程序的根文件夹。
- 资源根 :代表main文件夹下的配置文件。
- 测试资源根 :代表test文件夹下的配置文件。
以下目录结构中包含了项目执行之后生成的target文件夹。
以下是一个Maven构建的Java项目执行完程序之后结构,Java项目生成的是jar包
21.idea创建Web项目
使用模版创建项目
- maven-archetype-quickstart : 普通的java项目
- maven-archetype-webapp : web工程
以下就是使用maven-archetype-webapp模块设置的web工程目录
此时需手动在main文件夹下创建一个Java目录(源根),还需一个存放主程序配置文件夹(资源根)
还需要在src下创建一个与main文件夹同级的测试文件夹(test),在test文件夹下创建一个测试文件夹(测试源根),还有一个测试文件夹下的配置文件夹(测试资源根)
以下就是一个完整的Web Maven项目结构
在Maven中不用从导入外部servlet (jar包)与 jsp(jar包),只需要在pom.xml中加入servlet与jsp依赖即可
注意:以下这些依赖项不需要手动编写,直接去中央仓库中下载这个pom.xml源代码。
中央仓库地址 :中央仓库
<dependencies> <!--这些依赖项全部写在dependencies标签内部--> <!--添加servlet依赖项(servlet的jar包)--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--添加jsp依赖项(jsp的jar包)--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> </dependencies> 复制代码
以下是一个Maven构建的Web项目执行完程序之后结构,Java项目生成的是war包
这个war包就是最终交付给客服的web文件,这个war包解压后可以直接使用
- 此时将这个war包放到 Tomcat/webapps下,之后启动Tomcat/bin/startup.bat,启动之后在网页上就可以直接运行这个war包中的文件。
22. idae中导入Maven工程(模块)
22.1 解决依赖不能识别的问题:
- 第一种 :将鼠标停留在pom.xml文件上,右键选中Maven,之后点击重新加载项目。
- 注意 :此时刷新的只是这一个项目的依赖文件。
- 第二种:在Maven栏中点击刷新按钮
- 注意 : 此时刷新的是整个在Maven栏中存在的项目
22.2 idea导入Maven模块
- 第一步 :找到项目结构,找到模块,然后点击加号,导入模块。
- 第二步 : 在你的资源管理器中找到你要导入的Maven模块。
- 第三步 : 选中从外部模型导入模块,选择Maven,点击确定。
- 第四步 :将缺少的依赖进行勾选。idea会自定为我们选择的。
23.依赖管理
- 依赖范围, 在pom.xml配置文件中使用scope标签表示的。
- scope:表示依赖使用的范围,也就是在maven构建项目的那些阶段中起作用。
- maven构建项目 编译, 测试 ,打包, 安装 ,部署 过程(阶段)
- scope的值有 : compile, test, provided ,默认是compile
- compile : 在编译, 测试 ,打包, 安装 ,部署 这些阶段都要用到这个依赖的jar包。
- test :只在测试程序阶段使用这个依赖jar包,
- provided(提供者) : 在编写主程序和运行程序阶段使用这个依赖jar包。
- 重点 : 使用compile ,该项目打包之后,会在生成的war包或者jar包中存在被compile声明的依赖项(即jar包),
使用provided,该项目打包之后,生成的jar包或者war包中不存在被peovided声明的依赖项(jar包)。 - 在pom.xm文件中添加依赖jar包的时候,如果本机仓库没有,Maven会自动到中央仓库进行下载,不用开发人员自己解决,并且加入依赖项的代码(坐标)可以去中央仓库进行复制粘贴。
24.Maven常用操作
24.1 Maven属性设置
- 这个属性设置是Maven提供的。
<!--在 properties标签中声明的就是Maven属性的设置 --> <!--maven.compiler.source 这是属性名,1.8这是属性值--> <properties> <!--maven构建项目使用的编码方式,避免中文乱码--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--编译代码使用饿jdk版本--> <maven.compiler.source>1.8</maven.compiler.source> <!--运行程序时使用的jdk版本--> <maven.compiler.target>1.8</maven.compiler.target> </properties> 复制代码
24.2 Maven全局变量
- 这个属性是开发人员自定义的。
- 自定义的属性 :
- 在 properties标签中 通过自定义标签声明变量(标签名就是变量名)。
- 在pom.xml文件中的其它位置,使用 ${标签名} 使用变量的值。
- 自定义全局变量一般是定义依赖的版本号, 当你的项目中要使用多个相同的版本号, 先使用全局变量定义, 在使用${变量名}
<!--在 properties 标签中声明自定义的全局变量--> <properties> <!--maven构建项目使用的编码方式,避免中文乱码--> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--编译代码使用饿jdk版本--> <maven.compiler.source>1.8</maven.compiler.source> <!--运行程序时使用的jdk版本--> <maven.compiler.target>1.8</maven.compiler.target> <!--自定义变量(这个变量名就是标签名),表示版本号--> <!--这个标签名可以自己定义,因为在XML文件中标签名随意定义,没有要求。--> <spring.version>5.2.0</spring.version> </properties> 复制代码
- 之后在其他地方使用这个版本号的时候就不用挨个的书写版本号,直接使用这个变量。
- 这样的话只要在properties 中修改这个版本号,修改一次,在其他的依赖中这个版本号都会更改。
24.3 资源插件
- 在pom.xml的 build标签中加入resources标签
<build> <!--只要将这个resources标签中放到buil标签中就可以,可以是任意的位置--> <resources> <resource> <directory>src/main/java</directory><!--所在的目录--> <includes><!--包括目录下的.properties,.xml 文件都会扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <!--filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了--> <filtering>false</filtering> </resource> </resources> </build> <!--以上代码代表的含义:将src/main/java目录下得所有.properties和.xml文件--> 复制代码
例如 :mybatis课程中会用到这个作用。
- 默认没有使用resources的时候, maven执行编译代码时, 会把src/main/resource目录中的文件拷贝到target/classes目录中。对于src/main/java 目录下的非Java文件不处理,不会拷贝到target/classes目录中。
- 我们程序有时需要把一些文件放在src/main/java 目录中,当我们在执行Java程序时,需要用到 src/main/java 目录中的文件,需要告诉Maven在 使用命令mvn compile 编译src/main/java目录下的程序的时候,需要把Java文件夹中的非Java文件一同拷贝到target/classes目录中