目录
1.Maven简介
1.1 概述
Maven是Apache软件基金会组织维护的一款自动化构建工具,专注服务于Java平台的项目构建和依赖管理。Maven是目前最流行的自动化构建工具,对于生产环境下多框架、多模块整合开发有重要作用,Maven是一款在大型项目种不可会缺的重要工具。
在未使用maven,传统开发项目的问题:
①一个项目有很多模块,模块之间有关系,需要手工管理关系,比较繁琐;
②需要很多第三方功能,需要很多jar包,需要手工从网络中获取各个jar包;
③需要管理jar包的版本,如果需要的是一个mysql.5.1.5.jar,就不能给一个mysql.4.0.jar;
④需要管理jar包之间的依赖。比如你的项目要使用a.jar包,而a.jar包中需要使用b.jar包里面
的类,此时必须首先获取到b.jar包才可以,然后才能使用a.jar包。a.jar需要b.jar这个关系叫
做依赖。或者说你的项目需要使用mysql的驱动,也可以叫做项目依赖mysql驱动。
1.2 Maven的作用
①maven可以管理jar文件
②自动下载jar包和它的文档、源代码
③管理jar之间的依赖,a.jar需要b.jar,maven会自动下载b.jar
④管理你需要的jar版本
⑤帮你编译程序,把.java编译为.class
⑥帮你测试你的代码是否正确
⑦帮你打包文件,形成jar文件或者war文件
⑧帮你部署项目
1.3 项目的构建
构建是面向过程的,就是一些步骤,来完成项目代码的编译、测试、运行、打包、部署等等。
maven支持的构建包括:
①清理:把之前项目编译的东西删除掉,为新的编译代码做准备。
②编译:把程序源代码编译为执行代码,即将.java文件编译为.class文件。maven的编译是批
量的,可以同时把成百上千的.java文件编译为.class文件;而javac一次只能编译一个文件。
③测试:maven可以执行测试程序代码,验证你的功能是否正确。maven的测试也是批量
的,可以同时执行多个测试代码,同时测试很多功能。
④报告:生成测试结果的文件,测试是否通过。
⑤打包:把你的项目中所有的.class文件、配置文件等所有资源放到一个压缩文件中。这个压
缩文件就是项目的结果文件,通常对于java程序,压缩文件的扩展名是.jar;对于web应
用,压缩文件的扩展名是.war。
⑥安装:把打包后生成的jar包、war包安装到本机仓库。
⑦部署:把程序安装好可以执行。
1.4 maven核心概念
①POM:一个文件名称是pom.xml,pom翻译后叫做项目对象模型。maven把一个项目当作一个模型使用,来控制maven构建项目的过程,管理jar依赖。
②约定的目录结构:maven项目的目录和文件的位置都是规定的。
③坐标:是一个唯一的字符串,用来表示资源的。
④依赖管理:管理你的项目可以使用jar文件。
⑤仓库管理:你的资源存放的位置。
⑥生命周期:maven工具构建项目的过程,就是生命周期。
⑦插件和目标:执行maven构建的时候用的工具是插件。
⑧继承
⑨聚合
1.5 maven工具的安装和配置
1.需要从maven的官网下载maven的安装包,apache-maven-3.3.9-bin.zip(与jdk8比较适配的版本)。
2.解压安装包,解压到一个非中文目录。
子目录bin:执行程序,主要是mvn.cmd
conf:maven工具本身的配置文件,settings.xml
3.配置环境变量。在系统的环境变量中,指定一个M2_HOME的名称,指定它的值是maven工具的安装目录。
4.验证,新的命令行中,执行mvn -v
注意:需要配置JAVA_HOME ,指定jdk路径
2.Maven的核心概念
2.1 Maven工程的约定目录结构
约定是大家都遵循的一个规则。每一个maven项目在磁盘中都是一个文件夹。
目录结构:
Hello/
---/src
------/main #放你的主程序java代码和配置文件
----------/java #你的程序包和包中的java文件
----------/resources #你的java程序中要使用的配置文件
------/test #放测试程序代码和文件的(可以没有)
----------/java #测试程序包和包中的java文件
----------/resources #测试java程序中要使用的配置文件
---/pom.xml #maven的核心文件(maven项目必须有)
2.2 第一次编译Maven管理的java项目
使用命令mvn compile,编译src/main目录下的所有java文件。
第一次编译时,会下载很多东西。
1.为什么要下载?
maven工具执行的操作需要很多插件(java类---jar包)完成。
部分下载源:
Downloading: https://repo.maven.apache.org/maven2/org/apache/maven/maven-plugin-parameter-documenter-2.0.9.pom
https://repo.maven.apache.org :中央仓库的地址
2.下载什么东西了?
jar包---叫做插件,插件是用来完成某些功能的。
3.下载的东西存放到哪里了?
默认仓库(本机仓库):
C:\Users\XXY\.m2\repository
怎么修改下载的东西存放的位置?即修改本地仓库地址。
1. 修改maven的配置文件, maven安装目录/conf/settings.xml
先备份 settings.xml
2. 修改 <localRepository> 指定你的目录(不要使用中文目录)
D:\work\maven_work\maven_repository
2.3 仓库
仓库是存放东西的,存放maven使用的插件(各种jar包)和我们项目使用的jar包(第三方工具)。
仓库的分类:
1.本地仓库:本机当前电脑上的资源存储位置,为本机上所有Maven工程提供服务;
2.远程仓库:不在本机上,通过网络才能使用,多电脑共享使用的。
①中央仓库:通过Intenet访问,为全世界所有的Maven工程服务,最权威的。
中央仓库的地址:https://repo.maven.apache.org
②中央仓库的镜像:加设在不同位置,欧洲、美洲、亚洲等每个洲都有若干的服务器,
为中央仓库分担流量,减轻中央仓库的访问、下载的压力。所在洲的用户首先访问的是
本洲的镜像服务器。
③私服:在局域网环境中部署的服务器,为当前局域网内的所有Maven工程服务,公司
中常常使用这种方式。
仓库的使用:maven仓库的使用不需要人为参与。
比如:开发人员需要使用mysql驱动--->maven首先查本地仓库--->私服--->镜像--->中央仓库
2.4 pom文件
Project Object Model,项目对象模型。Maven把一个项目的结构和内容抽象成一个模型,在xml文件中进行声明,以方便进行构建和描述。Maven环境搭建好之后,所有的学习和操作都是关于pom.xml的。
①坐标:在互联网中唯一标识一个项目。
<groupId>公司域名的倒写</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version>
https://mvnrepository.com/ 搜索使用的中央仓库, 使用groupId 或者 artifactId作为搜索条件
②packaging:打包后压缩文件的扩展名,默认是jar,web应用是war。
packaging可以不写,默认是jar
③依赖:项目种要使用的各种资源说明。
<dependencies>
<!--依赖 java代码中 import -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
</dependencies>
④properties:设置属性。
⑤build:maven在进行项目的构建时配置的信息。例如指定编译java代码使用的jdk的版本等。
2.5 Maven的生命周期
对项目的构建是建立在生命周期模型上的,它明确定义项目生命周期各个阶段,并且对于每一个阶段提供相对应的命令,对开发者而言仅仅需要掌握一小堆的命令就可以完成项目各个阶段的构建工作。
构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成,不论现在要执行生命周期中的哪个阶段,都是从生命周期的最初阶段开始的。
对于程序员而言,无论我们要进行哪个阶段的构建,直接执行相应的命令即可,无需担心它前边阶段是否构建,Maven会自动构建,这也是Maven这种自动化构建工具给我们带来的好处。
Maven的生命周期,就是maven构建项目的过程,清理、编译、测试、报告、打包、安装、部署
2.6 Maven的命令
Maven对所有的功能都提供相对应的命令,Maven提供一个项目构建的模型,把编译、测试、打包、部署都对应成一个个的生命周期阶段,并对每一个阶段提供相对于的命令。
注意:执行以上命令必须在命令行(DOS窗口)进入pom.xml所在目录!
其中mvn compile:
1.编译main/java/目录下的java 为class文件,同时把class拷贝到target/classes目录下面
2.把main/resources目录下的所有文件都拷贝到target/classes目录下
mvn package:打包的只是src/main下的所有文件。
2.7 Maven的插件
Maven构建的过程,由Maven的插件plugin来执行完成。插件就是一些jar文件,一些类。插件可以在自己的项目中设置,最常使用的是maven编译插件。设置项目使用的jdk版本时通过编译插件指定。
pom.xml文件中设置。
<!--控制配置maven构建项目的参数设置,设置jdk的版本-->
<build>
<!--配置插件-->
<plugins>
<!--配置具体的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<!--插件的名称-->
<artifactId>maven-compiler-plugin</artifactId>
<!--插件的版本-->
<version>3.8.1</version>
<!--配置插件的信息-->
<configuration>
<!--告诉maven,我们写的代码是在jdk1.8上编译的-->
<source>1.8</source>
<!--我们的程序应该运行在jdk1.8上-->
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
2.8 实例:单元测试
单元测试用的是junit,junit是一个专门测试的框架(工具)。
junit测试的内容:测试的是类中的方法,每一个方法都是独立测试的,方法是测试的基本单位(单元)。
maven借助单元测试,批量地测试类中的大量方法是否符合预期的。
使用步骤:
①加入依赖,在pom.xml中加入单元测试依赖。
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
②在Maven项目种的src/test/java目录下,创建测试程序。
推荐的创建类和方法的提示:
1.测试类的名称是Test+要测试的类名
2.测试方法的名称是test+要测试的方法名
例如你要测试HelloMaven ,创建测试类 TestHelloMaven
@Test
public void testAdd(){
测试HelloMaven的add方法是否正确
}
其中testAdd叫做测试方法,其定义规则:
1.方法必须是public的
2.方法必须是没有返回值的
3.方法名称是自动义的,推荐test+要测试的方法名
4.在方法的上面加上@Test
3.idea中配置使用Maven
在idea中设置maven,让idea和maven结合使用。
idea中内置了maven,一般不使用内置的,因为用内置修改maven的设置不方便。使用自己安装的maven,需要覆盖idea中的默认的设置,让idea指定maven安装位置等信息。
3.1 配置maven
参数为-DarchetypeCatalog=internal。
3.2 新建maven的module
1.普通的java项目
需要自己手动添加两个resources目录。
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.bjpowernode</groupId>
<artifactId>01-javase-maven</artifactId>
<version>1.0</version>
<name>01-javase-maven</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<!--maven构建项目使用的是utf-8,避免中文的乱码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译java代码使用的jdk版本-->
<maven.compiler.source>1.8</maven.compiler.source>
<!--你的java项目应该运行在什么样的jdk版本-->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--依赖-->
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2.创建web项目
此时如果想写Servlet,只需要在pom.xml文件中加入依赖即可。
<!--加入servlet依赖(servlet的jar)-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp的依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
如果添加依赖后没有及时导入,产生红色下划线,做以下操作:
3.3 maven的工具窗口
3.4 IDEA中导入Maven工程(module)
4.依赖管理
4.1 依赖范围
使用标签<scope>。表示依赖使用的范围,也就是在maven构建项目的哪些阶段中起作用。
5.Maven常用设置
5.1 Maven的属性设置
标签<properties>设置maven的常用属性。
<properties>
<!--源码编译 jdk 版本-->
<maven.compiler.source>1.8</maven.compiler.source>
<!--运行代码的 jdk 版本-->
<maven.compiler.target>1.8</maven.compiler.target>
<!--项目构建使用的编码,避免中文乱码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--生成报告的编码-->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
5.2 Maven的全局变量
①定义全局变量:在<properties>通过自定义标签声明变量(标签名就是变量名)。
<properties>
<spring.version>4.3.10.RELEASE</spring.version>
</properties>
②引用全局变量:在pom.xml文件中的其他位置,使用${标签名}使用变量的值。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
自定义全局变量一般用来定义依赖的版本号,当你的项目中要使用多个版本相同的版本号,先使用全局变量定义,再使用${变量名}。
5.3 指定资源位置
src/main/java和src/test/java这两个目录中的所有*.java文件会分别在compile和test-comiple阶段被编译,编译结果分别放到了target/classes和targe/test-classes目录中,但是这两个目录中的其他文件都会被忽略掉,如果需要把src目录下的文件包放到target/classes目录,作为输出的jar一部分,需要指定资源文件位置,此时就需要在<build>中加入<resources>。
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes>
<!--包括目录下的.properties,.xml 文件都会扫描到-->
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<!--filtering选项false不启用过滤器,*.property已经起到过滤的作用了-->
<filtering>false</filtering>
</resource>
</resources>
</build>
PS:根据动力节点课程整理,如有侵权,联系删除。