Maven入门
一、目前掌握的技术
二、目前技术存在的问题
- 一个项目就是一个工程,对于大的项目来说,层次很乱,不适合用package划分模块;
要让每个模块对应一个工程,有利于分工,只有借助Maven才能实现。 - 项目中需要的jar包需要手动"复制粘贴"到WEB-INF/lib目录下;
同样的jar包重复出现在不同的项目工程中,一方面浪费存储空间,另一方面也让工程比较臃肿。
借助Maven可以将jar包仅仅保存在仓库中,有需要使用的工程,“引用”该文件接口,不需要复制jar包。 - jar包需要别人写好,或者在官网上下载;
借助Maven可以以一种规范的方式下载jar包,所有知名框架或者第三方工具的jar包以及按照统一的规范存放在Maven的中央仓库中。 - 一个jar包依赖的其他jar包需要手动加入项目。
三、Maven是什么?
- 是一款服务于java平台的自动化构建工具。
- 构建: 是以java源文件、框架配置文件、JSP、HTML、图片等资源为原材料,去生产一个可以运行的项目的过程。
编译—>部署—>搭建
四、Maven四大特性
1. 依赖管理系统
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
groupld: 定义当前Maven项目隶属的实际项目-公司名称
artifactId: 定义实际项目中一个Maven模块-项目名
version: 定义Maven项目当前所处版本
2. 多模块结构
3. 一致的项目结构
4. 一致的构建模型和插件机制
五、Maven的安装配置
- 检查JDK版本,1.7以上
2. 下载Maven
https://maven.apache.org/download.cgi#files
3.配置Maven环境变量
注: maven的解压路径中不能含有中文字符和空格
4.检查是否配置成功
打开dos窗口,输入 mvn -v ,能够打印出下面的信息,则表示配置成功。
六、Maven项目的目录结构
手动创建一个基本的maven项目目录结构
pom.XML结构
<?xml version="1.0" encoding="UTF-8"?>
//根标签
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>maven02</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>maven02</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
七、修改jar包下载地址,更改镜像源
找到解压的conf文件夹,修改settings.xml的内容,
1.修改jar包下载路径2.修改镜像源
将jar包下载到修改的目录文件下。
八、常用的Maven命令
Maven的命令格式:mvn [plugin-name]:[goal-name]
执行 plugin-name 插件的 goal-name 目标
1.-D 传入属性参数 mvn package -Dmaven.test.skip=true
以 -D 开头,将 maven.test.skip 的值设为 true ,就是告诉maven打包的时候跳过单元测试。 mvn deploy-Dmaven.test.skip=true 代表部署项目并跳过单元测试。
2. -P 使用指定的Profile配置
profiles 定义了各个环境的变量 id , filters 中定义了变量配置文件的地址,其中地址中的环境变量就是上面 profile 中定义的值, resources 中是定义哪些目录下的文件会被配置文件中定义的变量替换。
九、Maven创建java项目
点击运行即可
十、Maven创建Web项目
创建成功后修改pom.XML文件
删除pluginManagement标签
<!-- 将这个标签及标签中的内容全部删除 -->
<pluginManagement>
...
</pluginManagement>
添加web部署插件
在 build 标签中添加 plugins 标签
- Jetty插件
<!-- 设置在plugins标签中 -->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<!-- 热部署,每10秒扫描⼀次 -->
<scanIntervalSeconds>10</scanIntervalSeconds>
<!-- 可指定当前项⽬的站点名 -->
<contextPath>/test</contextPath>
<connectors>
<connector
implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>9090</port> <!-- 设置启动的端⼝号 -->
</connector>
</connectors>
</configuration>
</plugin>
- Tomcat插件
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8081</port> <!-- 启动端⼝ 默认:8080 -->
<path>/test</path> <!-- 项⽬的站点名,即对外访问路径 -->
<uriEncoding>UTF-8</uriEncoding> <!-- 字符集编码 默认:ISO-8859-1 -->
<server>tomcat7</server> <!-- 服务器名称 -->
</configuration>
</plugin>
运行项目也可通过jetty:run-Djetty.port=8899
命令自定义端口
还可以用过tomcat7:run
命令运行
十一、Maven仓库的使用
https://mvnrepository.com/
Maven官网中搜索需要使用的jar包
十二、Maven环境下构建多模块项目
- 创建父类项目,不选择模板,直接next
2.填写项目信息3.在父模块上创建子模块
maven_dao模块
maven_service模块
maven_controller模块
4.修改pom.XML中的配置文件,同第十步。
5.设置模块依赖关系
(1)在maven_dao模块中新建dao包,创建UserDao类
(2)在maven_service中创建service包,创建UserService类,调用UserDao中的方法,必须要先引入UserDao的依赖。
<!--引入maven_dao模块中的依赖-->
<dependency>
<groupId>com.zgf</groupId>
<artifactId>maven_dao</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
(3)在maven_controller模块中创建com.zgf.controller包,创建UserServlet类,引入相关依赖。
<!--引入maven_service模块的依赖-->
<dependency>
<groupId>com.zgf</groupId>
<artifactId>maven_service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<!--引入servle依赖-->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>servlet-api-2.5</artifactId>
<version>6.1.4</version>
<scope>compile</scope>
</dependency>
(4)添加tomcat插件,运行项目
<!-- 添加插件 -->
<plugins>
<!-- tomcat7插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<!-- <port>8080</port> -->
<path>/web</path>
<uriEncoding>UTF-8</uriEncoding>
<server>tomcat7</server>
</configuration>
</plugin>
</plugins>
十三、Maven打包操作
- 创建Web项目,建立对应的目录结构
2.添加Profile配置
<!-- 打包环境配置 开发环境 测试环境 正式环境 -->
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<!-- 未指定环境时,默认打包dev环境 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<profile>
<id>product</id>
<properties>
<env>product</env>
</properties>
</profile>
</profiles>
3.设置资源文件配置
<!-- 对于项⽬资源⽂件的配置放在build中 -->
<resources>
<resource>
<directory>src/main/resources/${env}</directory>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.tld</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
4.执行打包操作clean compile package -Pdev -Dmaven.test.skip=true
clean:清除缓存
compile:编译
package:打包
-Pdev:指定目录
-Dmaven.test.skip=true:跳过测试单元
生成的war包在target文件夹下
十四、Maven依赖的基本配置
依赖基本配置
根元素project下的dependencies可以包含多个 dependence元素,以声明多个依赖。每个依赖都应该包含以下元素:
- groupId, artifactId, version : 依赖的基本坐标, 对于任何⼀个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
- Type: 依赖的类型,⼤部分情况下不需要声明。 默认值为jar
- Scope: 依赖范围(compile,test,provided,runtime,system)compile: 编译依赖范围。如果没有指定,就会默认使⽤该依赖范围。使用此依赖范围的Maven依赖,对于编译、测试、行三种classpath都有效。
- test: 测试依赖范围。使用此依赖范围的Maven依赖,只对于测试classpath有效,在编译主代码或者运行项目的使用时将无法使⽤此类依赖。典型的例⼦就是JUnit,它只有在编译测试代码及运行测试的时候
才需要。 - provided: 已提供依赖范围。使⽤此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时无效。典型的例子是servlet-api,编译和测试项目的时候需要该依赖,但在运行项⽬的时候,由于容器已经提供,就不需要Maven重复地引⼊⼀遍(如:servlet-api)。
- runtime: 运行时依赖范围。使⽤此依赖范围的Maven依赖,对于测试和运⾏classpath有效,但在编译主代码时无效。典型的例⼦是JDBC驱动实现,项⽬主代码的编译只需要JDK提供的JDBC接⼝,只有在执行测试或者运⾏项⽬的时候才需要实现上述接⼝的具体JDBC驱动。
- system: 系统依赖范围。该依赖与三种classpath的关系,和provided依赖范围完全⼀致。但是,使用system范围依赖时必须通过systemPath元素显式地指定依赖⽂件的路径。由于此类依赖不是通过Maven仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使⽤。
- Optional:标记依赖是否可选
- Exclusions: 用来排除传递性依赖。
依赖范围
⾸先需要知道,Maven在编译项⽬主代码的时候需要使⽤⼀套classpath。 ⽐如:编译项⽬代码的时候需要⽤到spring-core, 该⽂件以依赖的⽅式被引⼊到classpath中。 其次, Maven在执⾏测试的时候会使⽤另外⼀套classpath。 如:junit。最后在实际运⾏项⽬时,⼜会使⽤⼀套classpath, spring-core需要在该classpath中,⽽junit不需要。那么依赖范围就是⽤来控制依赖与这三种classpath(编译classpath,测试classpath,运⾏时classpath)的关系, Maven有以下⼏种依赖范围:
1.Compile 编译依赖范围。 如果没有指定,就会默认使⽤该依赖范围。 使⽤此依赖范围的Maven依赖, 对于编译,测试,运⾏都有效。
2.Test: 测试依赖范围。 只在测试的时候需要。⽐如junit
3.Provided: 已提供依赖范围。 使⽤此依赖范围的Maven依赖,对于编译和测试有效, 但在运⾏时⽆效。 典型的例⼦是servlet-API, 编译和测试项⽬的需要, 但在运⾏项⽬时, 由于容器已经提供, 就不需要Maven重复地引⼊⼀遍。
4.Runtime: 运⾏时依赖范围。 使⽤此依赖范围的Maven依赖,对于测试和运⾏有效, 但在编译代码时⽆效。 典型的例⼦是:jdbc驱动程序, 项⽬主代码的编译只需要jdk提供的jdbc接⼝,只有在执⾏测试或者运⾏项⽬的时候才需要实现上述接⼝的具体jdbc驱动。
5.System: 系统依赖范围。 ⼀般不使⽤。
传递性依赖
传递依赖机制, 让我们在使⽤某个jar的时候就不⽤去考虑它依赖了什么。也不⽤担⼼引⼊多余的依赖。 Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引⼊到当前目中.