1.web项目开发的基础结构
2.为什么要maven
一、有利于分配任务,把大项目分成小项目,一个项目就是一个工程
如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个项目,利于分工协作。
借助于maven就可以将一个项目拆分成多个工程。
二、lib目录是存jar包的,以前是下载手动复制粘贴,有了maven就可以自动导入。
例如:
<dependencies>
<dependency>
<groupId>com.companyname.groupname</groupId>
<artifactId>App-Data-lib</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
三、现在的大框架基本都放在了maven仓库中,打个比喻就是我们需要一个东西,直接去maven中心搬运就可以了,不要再找来找去。
四、jar包之间的关系是很复杂的,一个jar可以依赖另一个jar,通过maven我们不需要了解这些关系,直接配置就可以了。
3.maven构建的意思
tips:现在比较流行maven,idea中的gradle也是构建工具。
构建:就是以我们编写的Java代码、框架配置文件、国际化等其他资源文件、jsp页面和图片等静态资源作为“原材料”,去“生产”出一个可以运行的项目的过程。
在实际开发中,我们的idea实际上已经帮我们做了很多工作,比如你写好一个项目,直接运行,其实就进行了编译。
构建的实际过程包含了:编译---部署
编译:例如我们写的java文件,运行时就要先编译成class类
部署:构建web工程中,我们需要打包成war,springboot可以直接打包成jar。我们在服务器运行时最终运行的是项目构建的结果,而不是你编写的项目
maven构建以后的对应关系
实际你写代码的时候肯定是
但如上述路径中没有webContent,就是因为编译部署的原因。对应图如下。
我们运行的是编译结果,而不是项目,编译结果的classes是由src编译来的,最终到web-inf中去了。
所以我们在src中写路径是就要注意了。附赠一篇讲的很好的博客https://www.cnblogs.com/story-xc/p/10835081.html
maven运行时使用jar包的方法是引用,也就是你通过配置xml文件下载的,项目运行时,maven会去本地仓库找,找到不下载。找不到就下载,而不同的项目可以在引用同一个jar
而不用每个项目都粘贴复制一套。
4.maven中心环节
构建过程中的几个主要环节
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:将每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java工程对应jar包,Web工程对象war包。
⑥安装:在Maven环境下特指将打包的结果——Jar包或War包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行。
5.maven安装
翻还原安装环境那个的博客有写。现在的idea中基本都内置maven插件,但是不建议用,我喜欢在cmd运行maven命令,当然还有其他的原因。
6.maven核心概念
- 约定的目录结构
- POM
- 坐标
- 依赖
- 仓库
- 生命周期/插件/目标
- 继承
- 聚合
7.约定的目录结构:
maven也不是万能的,也要按照一定的规章制度使用,按照它的规则maven才能找到你的文件,并且进行管理,当然你也可以自定义
maven的目录结构如下
自定义在xml文件中使用这个参数自定义:
xml解析
8.maven常用命令
注意:执行与构建过程相关的Maven命令,必须进入pom.xml 所在的目录,项目在命令行编译比在编译器里快。
常用命令
【1】mvn clean : 清理,如果该项目你以前编译过,再次编译需要先清理class等编译文件
【2】mvn compile : 编译主程序,本地没jar包可能会下载jar包,你也可以更改maven的jar的下载后的存储地址,具体见还原环境那篇文章
【3】mvn test-compile : 编译测试程序
【4】mvn test : 执行测试
【5】mvn package : 打包
【6】mvn install : 安装
【7】mvn site :生成站点
maven install:
在我们了解了别人的依赖怎么用,我们自己打的war和jar包怎么使用的,同样也是加pom依赖,利用坐标
在我们加完以后,发现找不到,这怎么回事啊?
因为我们的war或者jar没有进行install,千万不要自己按照路径在自己仓库建立一个,然后拷贝jar包,没用。
不进行maven install,就不会生成一系列的文件让maven找到它
9.pom文件
含义:Project Object Model 项目对象模型
DOM :Document Object Model 文档对象模型
pom.xml 对于 Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件中进行配置。
重要程度相当于web.xml 对于动态web工程
10.坐标
怎么在maven工程中唯一定义一个项目?
需要三个:1.groupid--一般是公司域名+项目名
2.artifactid--模块名
3.version--版本名
例如下个依赖就是找的com.companyname.groupname下的App-Data-lib模块的1.0版本
<dependencies> <dependency> <groupId>com.companyname.groupname</groupId> <artifactId>App-Data-lib</artifactId> <version>1.0</version> </dependency> </dependencies>
version后面有时候会有后缀
这个意思是快照,不稳定版本
0.0.1-release版本基本是非常好的了,下载要找release
11.仓库分类
![](https://img2018.cnblogs.com/i-beta/1325371/202002/1325371-20200210112429003-595516800.png)
镜像存在的原因就是为了方便下载,访问外网很慢。
12.依赖范围
你既然有了依赖的jar包,但是对于不同场景,有些依赖是不用的,比如test的依赖在开发中可能没什么用处
所以pom.XML中就有了<scope>这个
<scope>分为三个compile,test,provided
1.compile
2.test范围依赖
》对主程序是否有效:无效
》对测试程序是否有效:有效
》是否参与打包:不参与
》是否参与部署:不参与
》典型例子:Junit
3.provided
》对主程序是否有效:有效
》对测试程序是否有效:有效
》是否参与打包:不参与
》是否参与部署:不参与
》典型例子:Servlet-api.jar
13.maven传递依赖
A依赖B,B依赖C,A能否使用C呢?要看B依赖C的范围是不是compile
配置方式:
<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>
14 maven生命周期。
各个构建环节执行的顺序:不能打乱顺序,必须按照既定的正确顺序来执行。
Maven的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。
Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期中各个阶段:不论现在要执行生命周期中的哪一阶段,都是从这个生命周期最初的位置开始执行。
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 之后立刻完成的工作
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生命周期
①pre-site 执行一些需要在生成站点文档之前完成的工作
②site 生成项目的站点文档
③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
④site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这可是 Maven 相当强大的功能,Manager 比较喜欢,文档及统计数据自动生成,很好看。
插件和目标
Maven的核心仅仅定义了抽象的声明周期,具体的任务都是交由插件完成的。
每个插件都实现多个功能,每个功能就是一个插件目标
Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
可以将目标看做“调用插件功能的命令”
例如:compile 就是插件 maven-compiler-plugin 的一个目标;pre-clean 是插件 maven-clean-plugin 的一个目标。
个人觉得生命周期了解一下就行了,明白上述maven命令需要按顺序,若跳着执行B名,则B命令之前的命令一定会执行以后才执行B。
15.继承
现状
Hello依赖的Junit:4.0
HelloFriend依赖的Junit:4.0
MakeFriends依赖的Junit:4.9
由于test范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致。
需求:统一管理各个模块工程中对Junit依赖的版本。
解决思路:将Junit依赖统一提取到“父”工程中,在子工程中声明Junit依赖是不指定版本,以父工程中统一设定的为准。同时也便于修改。
操作步骤:
①创建一个Maven工程作为父工程。注意:打包方式为pom
②在子工程中声明对父工程的引用
③将子工程的坐标中与父工程坐标中重复的内容删除
④在父工程中统一管理Junit的依赖
⑤在子工程中删除Junit依赖的版本号部分
注意:配置集成后,执行安装命令时要先安装父工程。
16、聚合
聚合和继承不一样。继承是子继承父,而聚合是把子工程放在一个大框里,只是划了圈儿
聚合的好处是你在安装时不用一个一个子项目安装了,直接安装聚合的工程
配置方法
安装方法
17、Maven 酷站
我们可以到 http://mvnrepository.com/搜索需要的 jar 包的依赖信息。
本文仅用于作者记笔记,如有侵权,必删。笔记都来自黑马,和一个博主的记录,非常感谢
https://blog.csdn.net/zxm1306192988/article/details/76209062