Maven使用教程
Maven使用教程
定西Maven
Maven个人使用指南
加油
- 文中图片均来自尚硅谷Maven课程
所以Maven就是更加方便的管理jar包的工具?
不对,Maven还可以作为构建管理工具
构建
Java项目开发过程中,构建指的是使用原材料生产产品的过程
- 原材料
- Java源代码
- 基于HTML的Thymeleaf文件
- 图片
- 配置文件
- ……
- 产品
- 一个可以在服务器上运行的项目
构建过程的主要环节
- 清理:删除上一次构建的结果,为下一次构建做好准备
- 编译:Java源程序编译成.class字节码文件
- 测试:运行提前准备好的测试程序
- 报告:针对刚才测试的结果生成一个全面的信息
- 打包
- Java工程:jar包
- Web工程:war包
- 安装:把一个Maven工程经过打包操作生成的jar包或war包安装到Maven仓库
- 部署:将准备好的jar包或war包部署到服务器上运行
- 部署jar包: 把一个jar包部署到Nexus私服服务器上
- 部署war包:借助相关的Maven插件(cargo),将war包部署到Tomcat服务器上
依赖及工作机制
如果A工程里面用到了B工程的类,接口,配置文件等等这样的资源,那么我们就可以说A依赖B
Maven的工作机制:
下载配置
目录:
配置本地仓库的路径:
在 D:\java_instal\apache-maven-3.8.6\conf\settings.xml
1 | <!-- localRepository |
小插曲,买了个小拓展坞,typec转vga和hdmi,家里这个老显示器,但也不老,1600X900的分辨率,19.5英寸,这个PPI还是挺高的,接近1920X1080的24寸显示器,等过几天买回来试试吧,好用的话就可以组双屏了!!!
配置阿里云提供的镜像仓库
Maven下载jar包默认访问境外的中央仓库,改成阿里云提供的镜像仓库,访问国内网站,可以让Maven下载jar包的时候速度更快
配置方式
将下面mirror标签整体复制到setting.xml文件的mirros标签的内部
1 | <mirror> |
配置Maven工程的基础JDK版本,如果按照默认运行,Java工程使用的默认JDK版本是1.5,而我们熟悉和常用的是JDK1.8版本,修改配置方式是:将profile标签整个复制到settings.xml文件的profiles标签内
1 | <profile> |
然后就要检查一下环境变量了
这个没问题,当时Tomcat都可以用
然后就是配置MAVEN_HOME
路径:D:\java_instal\apache-maven-3.8.6
就跟配置JAVA_HOME一样,放到bin目录的前一个目录
然后看PATH,像JAVA_HOME的PATH就是
%JAVA_HOME%\bin
而MAVEN的就是
%MAVEN_HOME%\bin
配置成功:
创建Maven工程
根据坐标创建Maven工程
向量说明
使用三个[向量]在[Maven的仓库]中唯一的定位到一个jar包
- groupld 公司或组织的id
- artifactid 一个项目或者是项目中的一个模块的id
- version 版本号
三个向量的取值方式
- groupld:公司或组织域名的倒序,通常也会加上项目名称
- 例如: com.zzmr.maven
- artifactld:模块的名称,将来作为Maven工程的工程名
- version:模块的版本号,根据自己的需要设定
- 例如:SNAPSHOT表示快照版本,正在迭代过程中,不稳定的版本
- 例如: RELEASE表示正式版本
**坐标和仓库中jar包的存储路径之间的对应关系
1 | <groupId>javax.servlet</groupId> |
上述坐标对应的jar包在Maven本地仓库中的位置:
Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar
具体操作
- 创建目录作为后面操作的工作空间
创建了一个:D:\maven-workspace\spaceVideo - 在命令窗口中打开该目录
- 使用命令生成Maven工程
运行 mvn archetype:generate命令
- mvn 主命令
下面是子命令: - archetype 插件
- generate 目标
调整
Maven默认生成的工程,对junit依赖的是较低的3.8.1版本,我们可以改成较适合的4.12版本
D:\maven-workspace\spaceVideo\pro01-maven-java 目录下的pom.xml
改成4.12即可,随后还可以删除自动生成的App.java和AppTest.java
1 | <dependencies> |
pom.xml的基本介绍
1 | <!-- project 根标签 表示对当前工程进行配置,管理 --> |
Maven核心概念POM
含义:
POM: Project Object Model 项目对象模型 和POM类似的事 DOM(Document Object Model) 文档对象模型,它们都是模型化思想的具体体现
模型化思想
POM表示将工程抽象为一个模型,再用程序中的对象来描述这个模型,这样我们就可以用程序来管理项目了,我们在开发过程中,最基本的做法就是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这样就可以在程序中计算与现实事务相关的数据
约定目录结构的意义
Maven为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用,例如:Maven执行编译操作,必须先去Java原程序目录读取Java源代码,然后执行编译,最后把编译结果存放在target目录
约定大于配置
执行Maven的构建命令
- 要求
运行Maven中和构建操作相关的命令时,必须进入到pom.xml,否则会看到:
1 | The goal you specified requires a project to execute but there is no POM in this directory |
mvn -v命令和构建无关
- 清理操作
mvn clean
效果: 删除target目录 - 编译操作
- 主程序编译: mvn compile
- 测试程序编译: mvn test-compile
- 主体程序编译结果存放的目录: target/classes
- 测试程序编译结果存放的目录: target/test-classes
执行mvn compile 一直报错,所以把下面的东西注掉,就好了
1 | <scope>test</scope> |
执行下面的 mvn test-compile一直报错
在dependencies中加入依赖:
1 | <dependency> |
删除操作倒是没什么问题,真是起了个大怪
- 测试操作
mvn test
测试的报告存放的目录: target/surefire-reports
直接执行mvn test 会自动构建的(mvn compile) - 打包操作
mvn package
打包的结果: jar包,存放的目录:target
同样也会先测试,再打包 - 安装操作
mvn install
安装完成后得到:d:\maven-repo\com\zzmr\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.jar
1 | <!-- 坐标信息 --> |
创建Maven版的Web工程
复制过来的一直错误:The goal you specified requires a project to execute but there is no POM in this directory
所以我手打了一遍
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
就好了
创建好的:
创建java类
HelloeServlet.java
1 | package com.zzmr.maven; |
web.xml
1 | <servlet-name>helloServlet</servlet-name> |
index.jsp
1 | <html> |
编译
此时直接执行mvn compile会报错,显示无法找到类
所以要先配置对servlet-api.jar包的依赖
到https://mvnrepository.com/下载servelt-api.jar
1 | <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> |
此时执行mvn compile可以执行成功
然后执行 mvn clean package即可打war包
此时会有:pro02-maven-web-1.0-SNAPSHOT
还有一个pro02-maven-web-1.0-SNAPSHOT.war
将这两个任意一个放到Tomcat的webapp页面即可
建议放pro02-maven-web-1.0-SNAPSHOT,因为就算放war包,依然是需要解压的
然后打开Tomcat就可以了
打开后去浏览器执行 http://localhost:8080/demo/index.jsp
此时Servlet程序已正常运行
让Web工程依赖Java工程
- 观念
明确一个意识:从来只有Web工程依赖Java工程,没有反过来Java工程依赖Web工程.本质上来说,Web工程依赖的Java工程其实就是Web工程里导入jar包,最终java工程会变化曾jar包,放在Web工程的WEB-INF/lib目录下 - 操作
在pro02-maven-web工程的pom.xml中,找到dependences标签,在dependencies标签中坐如下配置
1 | <!-- 配置对Java工程pro01-maven-java的依赖 --> |
新建:
src-test-java-com-zzmr-maven
然后将原Java项目的测试类复制到web-test下
然后执行命令 mvn test
奇怪的是这次竟然没有报错,上次执行该命令,如果不把scope标签注释掉,是会报错的
测试成功也证明,这个依赖是成功的
打包
mvn package
通过查看war包内的结构,我们看到被Web工程以来的Java工程确实是会变成Web工程的WEB-INF/lib目录下的jar包
查看依赖:
mvn dependency:list
还有树形结构
mvn dependency:tree
测试依赖的范围
- 依赖范围
标签的位置: dependencies/dependence/scope
标签可选值: compile/test/provided/system/runtime/import
还测试吗,又报错了….
妈的全报错,真是日了狗
结论
- compile 通常使用的第三方框架的jar包这样的项目实际运行时真正要用到的jar包都是以compile范围进行依赖的,比如SSM框架所需jar包
- test 测试过程中使用jar包,以test范围依赖进来,比如junit
- provided 在开发过程中需要用到的服务器上的jar包通常以provided范围依赖进来,比如servlet-api,jsp-api,而这个范围的jar包之所以不参与部署,就是避免和服务器上已有的同类jar包产生冲突,同时减轻服务器的负担,说白了就是”服务器已经有了,你就别带了”
测试依赖的传递性
使用compile范围依赖spring-core
1 | <!-- 以compile范围导入spring-core依赖,测试依赖的传递性 --> |
执行 mvn dependency:tree
即可得到,说明已经成功依赖spring-core的jar包
1 | [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ pro01-maven-java --- |
执行 mvn dependency:list
可得到
1 | [INFO] The following files have been resolved: |
在本地仓库中即可找到:D:\maven-repo\org\springframework\spring-core\4.0.0.RELEASE
测试依赖的排除
1 | <dependency> |
继承
Maven工程之间,A工程继承B工程
本质上是A工程的pom.xml中的配置继承了B工程中的pom.xml的配置
继承的作用: 在父工程中统一管理项目中的依赖信息,具体来说似乎管理依赖信息的版本
创建父工程 pro03-maven-parent
只有打包方式为pom的Maven工程能够管理其他Maven工程,打包方式为pom的Maven工程中不写业务代码,他是专门管理其他Maven工程的工程
创建:mvn archetype:generate
1 | Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 7: |
创建模块工程
模块工程类似于IDEA中的module,所以需要进入pro03-maven-parent工程的根目录,然后运行mvn archetype:generate 命令来创建模块工程
创建好多个子模块后
在父工程的pom.xml中会有如下变化
1 | <modules> |
在子工程中,会自动添加
1 | <parent> |
子工程的坐标特点:
1 | <!-- 子工程 groupId,version 如果和父工程一样,就可以省略 --> |
1 | <!-- 注意:即使在父工程配置了对依赖的管理,子工程需要使用具体哪一个依赖还是要明确配置 --> |
此时,在父工程该一下,子工程全部就改了,当然子工程的[version]版本要删掉
更方便的方法:
1 | <properties> |
可实现完全一样的效果,当要修改版本时,只需要更改zzmr.spring.version的值即可
聚合
部分组成整体
好处:一键执行Maven命令:很多构建命令都可以在总工程中一键执行.
4依赖5,5依赖6
千万不要有循环依赖的情况
IDEA集成MAVEN
终于等到你
基础配置:
直接新建项目:
说实话还是idea方便
这也太太太好用了,想用什么命令直接双击
- -D 表示后面要附加命令的参数,字幕D和后面的参数是紧挨着的,中间没有任何其他字符
- maven.test.skip=true 表示在执行命令的过程中跳过测试
- mvn clean install -Dmaven.test.skip=true
要去tools里更改默认的命令窗口-改成cmd即可用以上命令 睡觉了
直接install是不行的
会报:webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
因为web.xml的目录不一样
此时,加上下面的代码即可
1 | <properties> |
好短啊,就一点东西