Maven

前言: 生产环境下开发不再是一个项目一个工程,而是每一个模块创建一个工程,而多个模块整合在一起就需要使用到像 Maven 这样的构建工具。

1、为什么(Why)?

1.1 真的需要吗?
Maven 是干什么用的?这是很多同学在刚开始接触 Maven 时最大的问题。之所以会提出这个问题,是因为即使不使用 Maven 我们仍然可以进行 B/S 结构项目的开发。从表述层、业务逻辑层到持久化层再到数据库都有成熟的解决方案——不使用 Maven 我们一样可以开发项目啊?
在这里插入图片描述

2、目前的技术在开发中存在的问题[why]

1.一个项目就是一个工程
如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个项目,利于分工协作。
借助于maven就可以将一个项目拆分成多个工程。

2.项目中需要的jar包必须手动“复制”、”粘贴” 到WEB-INF/lib 项目下
带来的问题:同样的jar包文件重复出现在不同的项目工程中,一方面浪费存储空间,另外也让工程比较臃肿。
借助Maven,可以将jar包仅仅保存在“仓库”中,有需要使用的工程“引用”这个文件,并不需要重复复制。

3.jar包需要别人替我们准备好,或到官网下载
借助于Maven可以以一种规范的方式下载jar包,所有知名框架或第三方工具jar包已经按照统一规范放在了Maven的中央仓库中。

以规范的方式下载的jar包,内容也是可靠的

Tips:“统一的规范”不仅是对IT开发领域非常重要,对于整个人类社会都是非常重要的。

4.一个jar包依赖的其他jar包需要自己手动加到项目中
Maven会自动将被依赖的jar包导入进来。

3、Maven是什么[what]

1.Maven 是 一款服务于Java平台自动化构建工具。
构建工具的发展:Make→Ant→Maven→Gradle

2.构建:就是以我们编写的Java代码、框架配置文件、国际化等其他资源文件、jsp页面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。

  • 编译
  • 部署
  • 搭建

编译: Java源文件[User.java]→编译→Class字节码文件[User.Class]→交给JVM去执行

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

生的鸡处理熟的鸡
动态Web工程编译、部署编译结果

在这里插入图片描述
开发过程中,所有的路径或配置文件中配置的类路径等都是以编译结果的目录结构为标准的

Tips:运行时环境
在这里插入图片描述
其实是一组jar包的引用,并没有把jar包本身赋值到工程中,所以并不是目录。

Tips:tc_server
直接通过Eclipse Marketplace搜索安装即可
在这里插入图片描述

在这里插入图片描述
3.构建过程中的几个主要环节
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:将每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对象war包。
⑥安装:在Maven环境下特指将打包的结果——Jar包或War包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。

4.自动化构建
其实上述环节我们在 Eclipse 中都可以找到对应的操作,只是不太标准。那么既然 IDE 已经可以进行构建了我们为什么还要使用 Maven 这样的构建工具呢?

程序员工作内容:
在这里插入图片描述
从中我们发现很大一部分时间花在了“编译、打包、部署、测试”这些程式化的工作上面,而真正需要由“人”的智慧实现的分析问题和编码却只占了很少一部分。
在这里插入图片描述
能否将这些程式化的工作交给机器自动完成呢?——当然可以!这就是自动化构建。
在这里插入图片描述
此时 Maven 的意义就体现出来了,它可以自动的从构建过程的起点一直执行到终点:
在这里插入图片描述

4、安装Maven核心程序

1.进入maven 官网:http://maven.apache.org 下载Maven
解压Maven核心程序的压缩包,放在一个非中文、无空格 的路径下
在这里插入图片描述

2.检查JAVA_HOME环境变量
C:\Users\acoffee>echo %JAVA_HOME%
D:\java_developer_tools\java\jdk-11.0.2

3.配置Maven相关的环境变量
①MAVEN_HOME 或 M2_HOME
在这里插入图片描述
②path
在这里插入图片描述
4.验证:运行 mvn -v 命令查看Maven版本
在这里插入图片描述

5、Maven的核心概念

①约定的目录结构
②POM
③坐标
④依赖(最重要)
⑤仓库
⑥生命周期/插件/目标
⑦继承
⑧聚合

6、第一个Maven工程

1.创建约定的目录结构
Hello
|—src
|—|---main
|—|---|—java
|—|---|—resources
|—|---test
|—|---|—java
|—|---|—resources
|—pom.xml

2.为什么要遵守约定的目录结构呢?
Maven要负责我们这个项目的自动化构建,以编译为例,Maven要想自动进行编译,那么它必须知道Java源文件保存在哪里。

我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式:

①以配置文件的方式明确告诉框架
如 < param-value>classpath:spring-context.xml < /param-value>

②遵循框架内部已经存在的约定
如log4j的配置文件名规定必须为 log4j.properties 或 log4j.xml ;Maven 使用约定的目录结构

  • 约定(对架构有较深的理解) > 配置(对框架有比较深的理解) > 编码

7、Maven常用命令

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

2.常用命令:
【1】mvn clean : 清理
【2】mvn compile : 编译主程序
【3】mvn test-compile : 编译测试程序
【4】mvn test : 执行测试
【5】mvn package : 打包
【6】mvn install : 安装
【7】mvn site :生成站点

8、关于联网问题

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

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

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

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

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

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

6.修改默认本地仓库的位置可以让Maven核心程序到我们事先准备好的目录下查找插件
①找到Maven解压目录\conf\settings.xml
②在setting.xml 文件中找到 localRepository 标签
③将 < localRepository>/path/to/local/repo< /localRepository>从注释中取出
④将标签体内容修改为自定义的Maven仓库目录

  <localRepository>D:\java_developer_tools\java\RepMaven</localRepository>

9、POM

含义:Project Object Model 项目对象模型
DOM :Document Object Model 文档对象模型

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

10、坐标

1.数学中的坐标:
①在平面中,使用X,Y坐标可以唯一的定位平面中任何一个点。
②在空间中,使用X,Y,Z三个向量可以唯一的定位空间中的任何一个点。

2.Maven的坐标:
使用下面三个向量在仓库中唯一定位一个Maven工程

①groupid:公司或组织域名倒序+项目名:

	< groupid>com.atguigu.maven< /groupid>

②artifactid:模块名

< artifactid>Hello< /artifactid>

③version:版本

< version>1.0.0< /version>

3.Maven 工程的坐标与仓库中路径的对应关系,以spring为例

< 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

11、仓库

1.仓库的分类
①本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
②远程仓库
(1)私服:搭建在局域网环境中,为局域网范围内的所有Maven工程服务
在这里插入图片描述
(2)中央仓库:假设在Internet上,为全世界所有Maven工程服务
(3)中央仓库镜像:为了分担中央仓库流量,提升用户访问速度

2.仓库中保存的内容:Maven工程
①Maven自身所需要的插件
②第三方框架或工具的jar包
③我们自己开发的Maven工程

不管是什么样的 jar 包,在仓库中都是按照坐标生成目录结构,所以可以通过统一的方式查询或依赖。

12、依赖

1.当 A jar 包用到了 B jar 包中的某些类时,A 就对 B 产生了依赖,这是概念上的描述。Maven解析依赖信息时会到仓库中查找被依赖的jar包。

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

2.依赖的范围
①从项目结构角度理解compile和test的区别
在这里插入图片描述
compile范围依赖 :
》对主程序是否有效:有效
》对测试程序是否有效:有效
》是否参与打包:参与
》是否参与部署:参与
》典型例子:spring-core

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

②从开发和运行这两个阶段理解compile 和 provided 的区别
》对主程序是否有效:有效
》对测试程序是否有效:有效
》是否参与打包:不参与
》是否参与部署:不参与
》典型例子:Servlet-api.jar

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

		<!--compile-->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.17</version>
		</dependency>
		
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.9</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

执行结果:
在这里插入图片描述
通过执行结果我们可以清楚直观的了解范围依赖。
在这里插入图片描述

13、生命周期

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

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

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

4.Maven有三套相互独立的生命周期,分别是:
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
Default Lifecycle 构建的核心部分,编译、测试、打包、安装、部署等等。
Site Lifecycle 生成项目报告,站点,发布站点。

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

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

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

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

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

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

8.插件和目标
Maven的核心仅仅定义了抽象的声明周期,具体的任务都是交由插件完成的。
每个插件都实现多个功能,每个功能就是一个插件目标
Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
可以将目标看做“调用插件功能的命令”

生命周期阶段插件目标插件
compilecompilemaven-compiler-plugin
test-compiletestCompilemaven-compiler-plugin

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

14、在Eclipse中使用Maven

Maven插件Eclipse已经内置。

Maven插件的设置: Window->Preferences->Maven
①installations : 指定Maven核心程序的位置。默认是插件自带的Maven程序,改为我们自己解压的那个。
②user settings : 指定Maven核心程序中 conf/settings.xml 文件的位置,进而获取本地仓库的位置。

基本操作
①创建Maven版的Java工程
创建时勾选上 Create a simple project(skip archetype selection)
在这里插入图片描述

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

	<profile>  
     <id>jdk-1.8</id>  
     <activation>  
         <activeByDefault>true</activeByDefault>  
         <jdk>1.8</jdk>  
     </activation>
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <maven.compiler.source>1.8</maven.compiler.source>  
         <maven.compiler.target>1.8</maven.compiler.target>   
     </properties>   
	</profile>

在这里插入图片描述
执行maven命令:
在这里插入图片描述

②创建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文件中添加

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

4、jsp写入EL表达式时发现报错:javax.servlet.jsp cannot be resolved to a type
原因是我将servlet. jsp的以来设置为compile从而会导入servlet所依赖的el-api和jsp-api的jar包,而这两个jar包tomcat的lib(tomcat所依赖的的jar包的文件夹)中也有el-api和jsp-api的jar包从而就造成了jar包的冲突导致异常,所以我们这里将依赖范围改为provided即可。
在这里插入图片描述
在这里插入图片描述
tomcat中的lib:
在这里插入图片描述

15、继承

1.现状
Hello依赖的Junit:4.0
HelloFriend依赖的Junit:4.0
MakeFriends依赖的Junit:4.9

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

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

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

4.操作步骤:
①创建一个Maven工程作为父工程。注意:打包方式为pom
在这里插入图片描述
在这里插入图片描述
②在子工程中声明对父工程的引用
在这里插入图片描述
③将子工程的坐标中与父工程坐标中重复的内容删除
在这里插入图片描述
④在父工程中统一管理Junit的依赖
在这里插入图片描述
⑤在子工程中删除Junit依赖的版本号部分
在这里插入图片描述
注意:配置继承后,执行安装命令时要先安装父工程。

16、聚合

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

2.配置方式:在一个“总的聚合工程”中配置各个参与聚合的模块(跟顺序无关)
在这里插入图片描述
3.使用方式:在聚合工程的pom.xml 上点右键→run as→maven install

执行结果:
在这里插入图片描述

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

18、Maven 酷站

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值