目录
Maven的简介
Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
Maven的环境配置
要求 | |
JDK | Maven 3.3 要求 JDK 1.7 或以上 Maven 3.2 要求 JDK 1.6 或以上 Maven 3.0/3.1 要求 JDK 1.5 或以上 |
cmd控制台查看
c:\> java -version
Maven 下载地址:http://maven.apache.org/download.cgi
新建系统变量 MAVEN_HOME,变量值为maven的解压目录下的bin目录
编辑系统变量 Path,添加变量值:;%MAVEN_HOME%\
检查maven是否配置成功
cmd控制台运行
mvn -v
Maven目录结构
Maven的优化
maven目录\conf\settings.xml
1.修改默认仓库位置
添加仓库配置位置
<localRepository>要修改的仓库地址</localRepository>
2.更换阿里镜像,加快依赖下载
<mirror>
<id>nexus-a1iyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
cmd下编译和运行
cmd下进入项目根目录
1.编译java文件
mvn compile
2.执行main方法
mvn exec:java -Dexec.mainClass="com.xxxx.demo.Hello"
第一次下载会比较慢
如果编译不成功,可能出现的问题
1.不是使用管理员权限执行dos命令
2.JDK环境配置有问题,重装DK
3.代码编写时,类里面没设置包名(如果编译时类没加包名,执行时也不需要加包名)
Maven命令
Maven的命令格式如下:
mvn [plugin-name] : [goal-name]
命令代表的含义:执行plugin-name插件的 goal-name目标
常用命令
命令 | 描述 |
---|---|
mvn -version | 显示版本信息 |
mvn clean | 清理项目生产的临时文件,一般是模块下的target目录 |
mvn compile | 编译源代码,一般编译模块下的src/main/java目录 |
mvn package | 项目打包工具,会在模块下的target目录生成jar或war等文件 |
mvn test | 测试命令,或执行src/test/java/下junit的测试用例 |
mvn install | 将打包的jar/war文件复制到你的本地仓库中,供其他模块使用 |
mvn deploy | 将打包的文件发布到远程参考,提供其他人员进行下载依赖 |
mvn site | 生成项目相关信息的网站 |
mvn eclipse:eclipse | 将项目转化为Eclipse项目 |
mvn dependency:tree | 打印出项目的整个依赖树 |
mvn archetype:generate | 创建Maven的普通java项目 |
mvn tomcat7:run | 在tomcat容器中运行web应用 |
mvn jetty:run | 调用Jetty插件的Run目标在Jetty Servlet容器中启动web应用 |
注意:
运行maven命令的时候,首先需要定位到maven项目的目录,也就是项目的pom .xml文件所在的目录。否则,必需通过参数来指定项目的目录。
命令参数
上面列举的只是比较通用的命令,其实很多命令都可以携带参数以执行更精准的任务。
-D传入属性参数
例如:
mvn package -Dmaven.test.skip=true
以-D开头,将maven.test.skip的值设为true ,就是告诉maven打包的时候跳过单元测试。
同理,mvndeploy-Dmaven.test.skip=true代表部署项目并跳过单元测试。
-P使用指定的Profile配置
比如项目开发需要有多个环境,一般为开发,测试,预发,正式4个环境。
通过maven可以实现按不同环境进行打包部署,例如:
mvn package -Pdev -Dmaven.test.skip=true
表示打包本地环境,并跳过单元测试
IDEA编辑器集成Maven环境
1、IDEA 2018
位置:在file ⇨ Other Settings ⇨ Default Settings
2、IDEA 2019
Other Settings没有改变,Default settings变成了Settings for New Projects
位置:在file ⇨ Other Settings ⇨ Settings for New Projects
3、IDEA 2020
Other Settings变成了New Projects Settings
位置:在file ⇨ New Projects Setup ⇨ Settings for New Projects
Maven项目的创建
创建Java项目
注:右下角弹出的提示框,选择"Enable Auto-Import"(Maven启动自动导入)
编译项目
打包项目
创建JavaWeb项目
启动项目
一、修改配置
1.修改jdk版本
2.设置单元测试的版本
3.删除pluginManagement标签
二、添加web部署的插件
在build标签中添加plugins标签
1.Jetty插件
<!--设置在plugins标签中-->
<!--Jetty插件-->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<!--热部署,每10秒扫描一次-->
<scanIntervalSeconds>10</scanIntervalSeconds>
<!--可指定当前项目的站点名-->
<contextPath>/maven03</contextPath>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>9090</port> <!--设置启动的端口号-->
</connector>
</connectors>
</configuration>
</plugin>
2.Tomcat插件
<!--Tomcat插件-->
<!--设置在plugins标签中-->
<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>
三、启动
1.jetty启动
如果要设置在启动时指定端口号
1.注释端口号的配置
2.添加命令
2.Tomcat启动
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>com.xxxx</groupId>
<artifactId>maven03</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>maven03 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>https://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>maven03</finalName>
<plugins>
<!--设置在plugins标签中-->
<!--Jetty插件-->
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.25</version>
<configuration>
<!--热部署,每10秒扫描一次-->
<scanIntervalSeconds>10</scanIntervalSeconds>
<!--可指定当前项目的站点名-->
<contextPath>/maven03</contextPath>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>9090</port> <!--设置启动的端口号-->
</connector>
</connectors>
</configuration>
</plugin>
<!--Tomcat插件-->
<!--设置在plugins标签中-->
<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>
</plugins>
</build>
</project>
Maven仓库
对于Maven来说,仓库只分为两类:本地仓库和远程仓库。
远程仓库分为三种:中央仓库,私服,其他公共库。
中央仓库是默认配置下,Maven下载jar包的地方。
私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其他项目使用。
其他公共库:常用的阿里云仓库配置。
maven依赖查询 https://mvnrepository.com/
Maven环境下构建多模块项目
这里以四个模块为例来搭建项目,以达到通俗易懂的初衷
模块maven_parent --基模块,就是常说的parent (pom)
模块maven_dao --数据库的访问层,例如jdbc操作(jar)
模块maven_service --项目的业务逻辑层(jar)
模块maven_controller --用来接收请求,响应数据(war)
一、创建项目
1.创建maven_parent项目
2.创建maven_dao模块
3.创建maven_service模块
创建maven_service模块的步骤与maven_dao模块一致。
4.创建maven_controller模块
创建maven_controller模块的步骤与maven_dao模块基本一致,只需要将第一步选择Maven模板设置为web项目即可。(模板类型: maven-archetype-webapp)
二、修改子模块的配置文件信息
- 设置JDK版本
- 设置单元测试JUnit版本
- 删除多余的配置
三、设置模块之间的依赖
1.maven_dao
新建包
在包中创建UserDao类
在类中添加方法
package com.xxxx.dao;
public class UserDao {
public static void testDao(){
System.out.println("UserDao Test....");
}
}
2.maven_service
添加maven_dao的依赖
dependencies标签中添加
<!--引入maven_dao模块的依赖-->
<dependency>
<groupId>com.xxxx</groupId>
<artifactId>maven_dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
在项目中添加UserService类,并添加方法
package com.xxxx.service;
import com.xxxx.dao.UserDao;
public class UserService {
public static void testService(){
System.out.println("UserService Test...");
//调用maven_dao模块的方法
UserDao.testDao();
}
}
3.maven_controller
添加maven_service模块的依赖
dependencies标签中添加
<!--引入maven_service模块的依赖-->
<dependency>
<groupId>com.xxxx</groupId>
<artifactId>maven_service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
添加Servlet的依赖
<!--引入servlet的依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
新建Java类,继承HttpServlet类,并重写service方法
package com.xxxx.controller;
import com.xxxx.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/user")
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("UserServlet Test....");
//调用maven_service模块的方法
UserService.testService();
}
}
四、添加Tomcat插件
在maven_controller中添加Tomcat插件
<!--Tomcat插件-->
<!--设置在plugins标签中-->
<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>
五、启动项目
如果启动失败,先将模块install
Maven的打包
一、建立对应的目录结构
使用idea创建项目,目录结构可能会缺失,需要通过手动添加对应的目录
1.添加Java源文件夹
2.添加资源文件夹
3.添加对应的文件夹目录
以及添加不同环境下对应的配置文件。(本地环境、测试环境、正式环境)
二、添加Profile配置
在pom.xml中添加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>
三、设置资源文件配置
项目资源文件的配置放在build中
<!--对于项目资源文件的配置放在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>
四、执行打包操作
最简单的打包
指定环境
clean compile package -P指定环境 -Dmaven.test.skip=true
不同的项目打包的文件不一样,一般来说,普通java项目打成jar包,web项目打成war包。
Maven依赖的基本概念
依赖的基本配置
根元素project下的dependencies可以包含多个dependence元素,以声明多个依赖。每个依赖都应该包含以下元素:
1.groupld, artifactld, version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
2.Type:依赖的类型,大部分情况下不需要声明。默认值为jar
3.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仓库解析的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。
4.Optional:标记依赖是否可选
5.Exclusions:用来排除传递性依赖。
依赖范围
首先需要知道,Maven在编译项目主代码的时候需要使用一套classpath。比如:编译项目代码的时候需要用到spring-core,该文件以依赖的方式被引入到classpath中。其次,Maven在执行测试的时候会使用另外一套classpath。如: junit。
最后在实际运行项目时,又会使用一套classpath,spring-core需要在该classpath中,而junit不需要。
那么依赖范围就是用来控制依赖与这三种classpath(编译classpath,测试classpath,运行时classpath)的关系,Maven有以下几种依赖范围:
Compile:编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的Maven依赖,对于编译,测试,运行都有效。
Test:测试依赖范围。只在测试的时候需要。比如junit
Provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试有效,但在运行时无效。典型的例子是servlet-API,编译和测试项目的需要,但在运行项目时,由于容器已经提供,就不需要Maven重复地引入一遍。
Runtime:运行时依赖范围。使用此依赖范围的Maven依赖,对于测试和运行有效,但在编译代码时无效。典型的例子是: jdbc驱动程序,项目主代码的编译只需要jdk提供的jdbc接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体jdbc驱动。
System:系统依赖范围。一般不使用。
传递性依赖
传递依赖机制,让我们在使用某个jar的时候就不用去考虑它依赖了什么。也不用担心引入多余的依赖。Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前项目中。
注意:传递依赖有可能产生冲突!!
冲突场景:
A-->B--->C (2.0)
A-->E--->C (1.0)
如果A下同时存在两个不同version的C,冲突! !(选取同时适合A、B的版本)