Maven基础
该文档是:Maven基础学习...
日期:2020-12-30
1. Maven简介
1.1 软件是一个工程
1.2 传统开发项目的问题
1.3 Maven概述
1.4 项目的构建
1.5 maven核心概念
1.6 maven工具的安装和配置
2. Maven的核心概念
2.1 Maven工程约定目录结构
2.2 第一个maven工程
2.3 仓库
2.3.1 仓库的概念
2.3.2 仓库存什么
2.3.3 仓库的类别
2.3.4 Maven 对仓库的使用
2.4 POM 文件
概述:
2.5 Maven的生命周期(重要)
2.5.1 什么是生命周期
Maven 强大的原因是有一个十分完善的生命周期,生命周期可以理解为项目构建步骤的集合,它定义了各个构建环节的执行顺序,有了这个顺序,Maven 就可以自动化的执行构建命令。
Maven 的核心程序中定义了抽象的生命周期,生命周期中各个阶段的具体任务是由插件来完成的。有三套相互独立的生命周期,各个构建环节执行顺序不能打乱,必须按照既定的正确顺序来执行。
①、Clean Lifecycle:在进行真正的构建之前进行一些清理工作
②、Default Lifecycle:构建的核心部分,编译、测试、打包、安装、部署等等。
③、Site Lifecycle:生成项目报告,站点,发布站点。
这三个都是相互独立的。你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。当然,也可以直接运行 mvn claen install site 运行所有这三套生命周期。下面我们分别来谈谈这三个生命周期。
清理生命周期(Clean Lifecycle):
每套生命周期都由一组阶段(Phase)来组成,我们平时在控制台输入的命令总是会对应于一个特定的阶段,比如运行mvn clean,这里的clean就是清理生命周期的一个阶段。
清理生命周期一共包含了三个阶段:
1.pre-clean(预清理):执行一些需要在clean阶段之前完成的工作。
2.clean(清理):移除所有上一次构建生成的文件。
3.post-clean(后清理):执行一些需要在clean结算之后立刻完成的工作。
mvn clean中的clean就是上面的clean。在一个生命周期中运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean就相当于mvn pre-clean clean。如果我们运行mvn post-clean,那么pre-clean和clean都会被运行。这是Maven的一个很重要的规则/特性,可以大大地简化命令的输入。
默认生命周期(Default Lifecycle)
默认生命周期是Maven最重要的一个生命周期,绝大部分工作都发生在这个生命周期中。
默认生命周期包含了以下的阶段(这里只列出常用和必要了解的,实际上还有很多):
process-resources:复制并处理资源文件,至目标目录,准备打包。
compile:编译项目的源代码。
process-test-resources:复制并处理资源文件,至目标测试目录。
test-compile:编译测试源代码。
test:使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
package:接受编译好的代码,打包成可发布的格式,如 JAR 。
install:将包安装至本地仓库,以让其它项目依赖。
deploy:将最终的包复制到远程的仓库,以让其它开发人员与项目共享。
其实默认生命周期中还提供了很多的阶段,但是因为实际上会经常使用到的也就只有complie、test、package、install和deploy五个阶段,这里也就不全部列出来了。想要了解所有的阶段的话,可以到Maven的官方网站中查阅:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html。
基本上,根据名称我们就能猜出每个阶段的用途。
站点生命周期(Site Lifecycle)
站点生命周期存在以下四个阶段:
1.pre-site(预站点):执行一些需要在生成站点文档之前的工作。
2.site(站点):生成项目的站点文档。
3.post-site(后站点):执行一些需要在生成站点文档之后完成的工作,并且为部署做准备。
4.site-deploy(站点部署):将生成的站点文档部署到特定的服务器上。
在这些阶段中,最常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点。这是Maven提供的一个相当强大的功能之一,深得管理者喜爱,因为文档和统计数据能够自动生成,并且很好看。
Maven生命周期的总结
Maven的生命周期的知识点比较简单,在使用上只要记住,在同一套生命周期中运行任何一个阶段的时候,它前面的所有阶段都会被执行就行了。这就是为什么当我们运行mvn install命令的时候,代码会被编译(compile)、测试(test)和打包(package)。
但是这一特性在不同一套的生命周期中并不适用,比如很容易会认为清理生命周期是在默认生命周期之前的必经阶段。也就是说,会被认为如果执行默认生命周期中的阶段的话,清理生命周期中的所有阶段都会被执行。而这是不对的,不同一套的生命周期之间是相互独立的,其中的阶段并不会相互影响。如果需要在打包之前先清理之前打包的内容,需要单独运行清理生命周期。当然了,一般也会建议这么做,否则可能出现一些打包的奇怪问题,比如有一些文件并没有被更新的问题。
另外需要注意的是,这些对项目及进行编译、测试、打包、运行、部署等工作在Maven中都是抽象的定义,Maven自身是不会实际负责这些工作的,而是交由插件来实现。意思就是说,Maven命令的实际工作执行者是各种各样的插件,通过插件提供的命令与Maven提供的阶段相互绑定来完成相应的工作。因此Maven的插件机制是完全依赖于Maven的生命周期的,要想运用好这些Maven命令插件,理解Maven的生命周期也就变得十分重要。
上面这张图是Idea开发工具中的Maven插件,只要理解了Maven的生命周期和其中的阶段,就能很好地使用这个插件了。
2.5.2 Maven的常用命令
maven可以使用命令,完成项目的清理,编译,测试等等**
d
2.5.3 Maven的插件
clean 插件 maven-clean-plugin:2.5
clean 阶段是独立的一个阶段,功能就是清除工程目前下的 target 目录。
resources 插件 maven-resources-plugin:2.6
resource 插件的功能就是把项目需要的配置文件拷贝到指定的目当,默认是拷贝 srcmainresources 目录下的件到classes 目录下。
compile 插件 maven-compiler-plugin
compile 插件执行时先调用 resouces 插件,功能就是把 srcmainjava 源码编译成字节码生成 class 文件,并把编译好的 class 文件输出到 targetclasses 目录下。
test 测试插件
单元测试所用的 compile 和 resources 插件和主代码是相同的,但执行的目标不行,目标 testCompile 和 testResources是把 srctestjava 下的代码编译成字节码输出到 targettest-classes,同时把 srctestresources 下的配置文件拷贝到targettest-classes。
package 打包插件 maven-jar-plugin
这个插件是把 class 文件、配置文件打成一个 jar(war 或其它格式)包。
deploy 发布插件 maven-install-plugin
发布插件的功能就是把构建好的 artifact 部署到本地仓库,还有一个 deploy 插件是将构建好的 artifact 部署到远程仓库。
2.5.4 Maven的插件之常用插件
插件可以在自己的项目中设置,最常使用的是 maven 编译插件。设置项目使用的 jdk 版本时通过编译插件指定。
pom.xml 文件<build>
中设置。
1.编译插件:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
表示使用jdk_1.8。【修改后更新项目】
2.tomcat插件
(1).基本应用
默认输入tomcat:run命令去使用tomcat插件来启动web工程,但是默认的tomcat插件使用的tomcat版本是tomcat6。如果想更改,需要手动配置tomcat插件:
<plugin>
<!-- 配置插件 -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
使用tomcat7来运行web工程,它的命令是:tomcat7:run(不是tomcat:run,否则path无效)
注意:path中的/表示当前web项目,故在访问的时候不需要输入项目名称(也就是该插件只能同时运行一个web项目),如当前web项目为maven,那么在访问webapp下面的index.jsp时只需要http://localhost:8080/index.jsp
附加,常见命令:
命令 | 描述 |
---|---|
tomcat:deploy | 部署一个web项目 |
tomcat:reload | 重新加载web项目 |
tomcat:start | 启动Tomcat服务器 |
tomcat:stop | 关闭Tomcat服务器 |
tomcat:undeploy | 停止项目 |
tomcat:run | 启动嵌入式Tomcat |
(2).发布到远程tomcat
使用 tomcat内部manager 程序,进行项目热部署 (需要远程tomcat 必须开启的 ),首先在 tomcat/conf/tomcat-user.xml 建立账号:
<!--图形化界面访问用户-->
<user username="shen" password="123456" roles="admin-gui,manager-gui" />
<!--远程服务器访问-->
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="123456" roles="manager-gui, manager-script"/>
tomcat6如下:
<role rolename="manager"/>
<user username="tomcat" password="123456" roles="manager"/>
tomcat7如下:
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="123456" roles="manager-gui, manager-script"/>
然后配置pom.xml 允许远程发布:
<!-- 使用 plugin 配置tomcat-maven-plugin -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<!-- 对插件进行配置 -->
<configuration>
<!-- 内嵌插件 端口 -->
<port>80</port>
<!-- 远程发布 -->
<url>http://localhost:8080/manager/text</url>
<server>myserver</server>
</configuration>
</plugin>
tomcat6如下:
<url>http://localhost:8080/manager</url>
tomcat7如下:
<url>http://localhost:8080/manager/text</url>
<server>myserver</server>
然后配置 setting.xml 服务器myserver 连接属性如下:
<server>
<id>myserver</id>
<username>tomcat</username>
<password>123456</password>
</server>
保证外部tomcat 正确运行后,执行 tomcat:deploy【打开】 / tomcat:redeploy 【关闭】,将会把当前项目发布到该远程tomcat服务器上。
2.6 坐标(gav)
2.7 依赖(dependency)
2.8 单元测试
3. Maven在IDEA中的应用(重要)
3.1 IDEA集成Maven
设置Maven:
设置Runner
3.2 IDEA创建Maven版java工程
创建 maven 版 java 工程
File-->New-->Module…:
填写 maven 工程的坐标
填写工程名和存储路径
当我们新建maven项目后,右下角都会有弹框提示
Import Changes Enable Auto-Import:导入我们新添加的依赖
Enable Auto-Import:以后更改 .pom 文件后自动下载依赖包
这里我们选择Enable Auto-Import。
pom.xml 加入依赖
这些是插件,是idea方便你去配置他们,把他们都给你列出来了,如果你不需要配置他们,整个build都可以不要。你写上不写上他们其实都有,给你列出来了目的是为了方便配置他们的参数。
创建后的视图
测试一下是否能运行
输出一条语句,测试项目构建成功。
3.3 IDEA创建Maven版web工程
3.3.1 创建 Maven版web工程
File-->New-->Module…:
填写 maven 工程的坐标
设置所使用的 maven
之前如果设置过Other Setting就会自动有。
填写 maven 工程名称和存储路径
当控制台出现” BUILD SUCCESS”时,表示工程创建完成。
创建后视图
显然,按照 maven archetype 原型创建的 maven web 工程缺少 maven 项目的完整结构:src-main-java / resources,src-test-java/resources,所以需要我们手动添加文件目录。
创建缺省文件夹
src-main-java / resources,src-test-java/resources
把文件夹标识为源码文件夹
File -> Project Structure, 选择Modules:右边找到java这层机构,在上面有个“Mask as”, 点下Sources,表示这里面是源代码类。
pom.xml 添加依赖
别的都和java工程中相同。
3.3.2 如何配置本地tomcat
然后编写测试类 HelloWorld 和测试页面 index.jsp
做法和平时JavaWeb没有区别,这里只讲如何配置本地tomcat。
1.在主页面打开ProjectStructure, File -->Project Struture 添加web选项,表明是一个web项目.
2.打开ProjectStructure后,按照图示依次点击Facets->+号,在弹出的对话框个中选择Web.
3.在弹出的对话框选择刚才创建的Maven项目,点击ok.
4.这里 点击Create artifact,创建web项目导出配置
5.点击Create artifact后,会自动跳到Artifacts标签。
6.选中Modules标签,点击+号,添加一个文件路径,指向你项目的webapp目录,点击ok
7.点击ok
8.给项目添加Tomcat 服务器 run --> Edit Configurtions...
9.点击+号,选择Tomcat Server --> Local
10.选中Server选项卡,Name这里可以写tomcat的名字,也可以不改,使用默认的。端口号默认是8080,根据自身需要是否更改,这里我未做更改。
11.选中Deployment选项卡,点击+号,点击Artifact,最后点击ok,完成。
12.启动Tomcat
13.浏览器输入 localhost:8080
3.4 IDEA中导入Maven工程(module)
新建一个空的 project 作为工作空间
在项目结构中导入或移除 module
File-->Project Structure…
选择要导入的 Module:
选择导入方式
选择要导入的项目
选择要导入的 maven 工程
没设置jdk,此处需要配置,已配置,略过这步
或者在Project Structure中选择一下
导入后项目结构
导入后视图
3.5 Maven小技巧
如果发现Maven pom文件依赖有问题爆红(idea没有立刻识别出来),可以尝试一下刷新
这是刷新对应pom的项目。
这是刷新所有项目。
4. 依赖管理
5. Maven常用设置
5.1 全局变量
在 Maven 的 pom.xml 文件中,<properties>
用于定义全局变量,POM 中通过${property_name}的形式引用变量的值。
定义全局变量(名字随便起):
引用全局变量(和上边的名字要相同):
Maven 系统采用的变量(系统自带,名字不能自己起得和下边相同):
5.2 指定资源位置插件
作用: mybatis课程中会用到这个作用
1.默认没有使用resources的时候, maven执行编译代码时, 会把src/main/resource目录中的文件拷贝到target/classes目录中。对于src/main/java目录下的非java文件不处理,不拷贝到target/classes目录中。
2.我们的程序有需要把一些文件放在src/main/java目录中,当我们在执行java程序时,需要用到src/main/java目录中的文件。需要告诉maven在mvn compile src/main/java目录下的程序时,需要把文件一同拷贝到target/classes目录中。(此时就需要在<build>
中加入<resources>
)