可以暂时把maven看做一个jar包管理工具即可,基于maven构建的项目中的jar包,可以通过maven来进行统一管理,更加方便和智能。
文章目录
一、安装
-
官网下载对应的安装压缩包
-
解压到一个全英文的目录
- 配置环境变量- maven的运行依赖于jdk的环境变量,所以要先确保配置了jdk的环境变量
- maven的运行依赖于jdk的环境变量,所以要先确保配置了jdk的环境变量
-
验证是否安装成功
二、仓库种类和关系
1.本地仓库的默认地址
- 在maven的安装目录下的conf文件夹下打开
settings.xml
文件
- 可以看到本地仓库的默认地址是系统盘下的目录 - 但是为了节省系统盘的宝贵空间,一般会修改这个默认的地址
2.仓库种类和关系
- 三种仓库
- 本地仓库:就是本地电脑上的一个个人仓库,如果属于联网状态,就会自动和中央仓库保持连接,下载需要的jar包
- 远程仓库:一些公司和单位为了保证在不联网或者公司局域网的状态下也能实现开发,就在内部建立一个仓库
- 中央仓库:包含了几乎所有开源的jar包
三、maven标准目录结构和常用命令
1.标准目录结构
2.常用命令
以一个待发布的项目为例,测试常用的命令
2.1 mvn clean
清除掉待发布项目下的
target
文件夹,为重新编译做准备,因为已有的target文件可能是以前在其他平台上编译的,所以要先清楚
target
文件夹被删除
2.2 mvn compile
compile是maven工程的编译命令,作用是将
src/main/java
下的文件编译为class文件输出到target目录下。
- 可以看到字节码文件成功被编译
2.3 mvn test
test是maven工程的测试命令
mvn test
,会执行src/test/java
下的单元测试类。
2.4 mvn package
package是maven工程的打包命令,对于java工程执行package打成jar包,对于web工程打成war包。
2.5 mvn install
install是maven工程的安装命令,执行install将maven打成jar包或war包发布到本地仓库。
2.6后面的命令覆盖前面的命令
就是执行后面的命令,如果前面的命令没有被执行,会被自动执行
三、maven生命周期
1、生命周期
2、概念模型图
四、使用骨架创建的maven的java工程项目
1、IDEA集成maven插件
前提条件是电脑上已经安装好了maven
-
IDEA初始界面进入设置
-
设置界面搜索
maven
-
设置本地maven地址和本地仓库
-
runner
设置
2.使用骨架创建maven的java项目(不推荐)
就是别人写好的一个模板,我们套用这个模板
- 观察当前项目的目录,发现并不是maven项目的标准项目,所以需要手动补齐
3.不使用骨架创建maven的java项目(推荐)
4.使用骨架创建maven的web项目
- 注意一个设置,不然会导致后面无法直接创建web三大组件
五、基于maven的web项目的简单实例
1.基本项目实现以及可能遇到的问题
写一个简单的servlet跳转到一个jsp文件
-
先创建一个servlet
-
这样创建出来的servlet,会自动在
xml
文件中完成一半的路径配置,我们需要补全
-
但是现在sevlet中找不到jar包,需要在pom文件中配置
- IDEA的提示功能,可以很方便的添加坐标
-
如何添加特定版本的jar包
- 进入maven中央仓库
https://mvnrepository.com/
- 搜索栏搜素jar包名字
- 点击版本号,进入,复制坐标地址接即可
- 进入maven中央仓库
-
在项目中,可以在右侧运行mvn命令
-
也可以通过命令行的方式来运行相关命令
-
tomcat启动后,尝试访问:
-
发现报错
-
这个报错的原因在于jar包冲突,即是存在了两套jar包
-
servlet和jsp这些包,在maven本身的安装目录下是存在的,我们又通过本地仓库导入了一套
-
为了避免,需要指定每个jar包的作用域,让其只在编译时期起作用
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
2.修改maven工程的运行环境
有时候我们想使用特定版本的tomcat和特定版本的jdk,就需要通过pom文件进行指定
2.1指定版本的tomcat并模板化代码
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8888</port>
</configuration>
</plugin>
- 在两个tomcat的端口不同的情况下,是可以同时启动两个服务器,并访问的
- 模板化
2.1指定版本的jdk并模板化代码
- 和上面的步骤几乎一样,就不细说了
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>mvn-compile-plugin</artifactId>
<configuration>
<taeget>1.8</taeget>
<resource>1.8</resource>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
六、maven中jar包的依赖范围
项目A依赖jar包B,则需要在A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括。
compile
:编译范围,指A在编译时依赖B,此范围为默认依赖范围。编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。provided
:provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用, provided依赖在编译和测试时需要,在运行时不需要,比如:servlet api被tomcat容器提供。runtime
:runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如:jdbc的驱动包。由于运行时需要所以runtime范围的依赖会被打包。test
:test范围依赖 在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用,比如:junit。由于运行时不需要所以test范围依赖不会被打包。system
:system范围依赖与provided类似,但是你必须显式的提供一个对于本地系统中JAR文件的路径,需要指定systemPath磁盘路径,system依赖不推荐使用。
1.小结
- 默认引入 的jar包 ------- compile 【默认范围 可以不写】(编译、测试、运行 都有效 )
- servlet-api 、jsp-api ------- provided (编译、测试 有效, 运行时无效 防止和tomcat下jar冲突)
- jdbc驱动jar包 ---- runtime (测试、运行 有效 )
- junit ----- test (测试有效)
- 依赖范围由强到弱的顺序是:
compile>provided>runtime>test