Maven
的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM
)
如图蓝色部分为 Maven
,其不包括外部其他部分,上部分为核心,下部分为各种插件。Maven
的作用如下
src
、resource
、target
等统一项目结构Maven
是由 Java
语言编写的,同样采用了面向对象的思想
Maven
官网进行下载 maven.apache.org/maven目录/conf/settings.xml
配置文件,配置阿里镜像地址(配置到
标签里)【可选】配置环境变量:新建 MAVEN_HOME:Maven根目录
,修改Path添加 %MAVEN_HOME%\bin
(注意:Maven
依赖环境变量中有 JAVA_HOME
),CMD输入 mvn -v
验证
【可选】因为Java默认的最大可用内存往往不够满足Maven运行需要,比如较大的项目时,使用Maven生成项目站点需要占用大量内存,可选配置 MAVEN_OPTS:-Xms128m -Xmx512m
注意 Maven
是由 Java
研发的,所以 Maven
依赖 Java
仓库概念
:仓库用于存储资源(各种 Jar
包),其分为本地仓库、远程仓库、中央仓库
Maven
私服,部门/公司范围内储存资源的仓库Maven
团队维护的,维护所有资源的仓库坐标概念
:坐标用于描述仓库中资源的位置,其构成部分及说明如下:
gourpId`:组织名,定义该 `Maven` 项目隶属组织,常是域名反写,如 `org.example.demo
artifactId
:项目名,定义该 Maven
项目名称
version
:版本号,定义该 Maven
项目的版本号
packaging
:定义项目的打包方式,如成果物类型 war
或 jar
,如组织项目的 pom
类型
Jar
包的获取会逐级搜索,如本地仓存在则直接使用本地仓,如不存在则到远程仓获取。以此类推
命令 | 说明 |
---|---|
mvn archetype:generate |
创建 Maven 项目,可通过参数指定坐标等 可以使用骨架:常用7号 quickstart 普通项目,10号 webappWEB 项目 |
mvn clean |
把已经编译好的项目的所有信息清除(target 文件夹) |
mvn compile |
自动导入 POM 中的依赖,并把核心代码部分编译后,放置在 target 目录下 |
mvn test |
通过此命令可以执行 test 文件夹下的测试用的内容,实现项目测试(同时执行了 compile ) |
mvn package |
将 Maven 项目进行打包,放置在 target 目录下(同时执行了 test ) |
mvn install |
将刚刚项目打完的包安装到本地仓库,由 maven 进行管理(同时执行了 package ) |
mvn deploy |
项目发布,将 maven 本地库中管理的资源发布到远程库中 |
<groupId>org.examplegroupId>
<artifactId>MVNDemo01artifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
<name>MVNDemo01name>
<description>xxxdescription>
<url>http://maven.apache.orgurl>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
dependency>
dependencies>
<dependencyManagement>
dependencyManagement>
<build>
<plugins>
<plugin>
plugin>
plugins>
build>
依赖是可以传递的,很有可能会发生依赖传递冲突问题,其优先级如下:
POM
文件中声明时,后配置的覆盖先配置的处理依赖传递有如下两种标签:
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>springbootartifactId>
<version>1.1version>
<optional>trueoptional>
<exclusions>
<exclusion>
<groupId>org.springframeworkgroupId>
<artifactId>bbbartifactId>
exclusion>
exclusions>
dependency>
依赖范围: 可以通过
标签指定其依赖范围,其作用如下:
scope | 编译 | 测试 | 打包 | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | Y | junit(仅测试使用) | ||
provided | Y | Y | 不传递 | servlet-api(Tomcat中包含) |
runtime | Y | jdbc(可防止编写时意外导入) | ||
system | Y | Y | 插件配置 includeSystemScope | 依赖来自本地系统,需要配合标签 systemPath 使用 |
import | 引入依赖项目,配合 使用 |
依赖范围具有传递性,开发时根据实际情况使用
插件的使用可以通过官网查询,不同插件有不同使用方式,根据文档说明进行操作。如下简单示例源码插件配置
xml复制代码<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.3.RELEASEversion>
<executions>
<execution>
<goals>
<goal>jargoal>
<goal>test-jargoal>
goals>
<phase>generate-resourcesphase>
execution>
executions>
plugin>
plugins>
build>
聚合用于快速构建 Maven
工程,一次性构建多个项目/模块。如多个项目/模块依赖,执行命令时需要每一个工程都进行编译,打包,安装,测试,部署等生命周期的命令,一个一个去执行这些命令效率非常低
Maven
提供了聚合的配置,实现统一执行命令,实现方法:创建一个无代码聚合工程,并在 POM
中配置所有聚合的项目/模块
xml复制代码
<packaging>pompackaging>
<modules>
<module>../child1module>
<module>child2module>
modules>
只是聚合项目关心有什么模块,模块不需要知道被谁聚合了
Maven
项目提供继承的特性,可以利用继承实现所有项目资源版本统一的问题。其继承的父类资源包括:
继承项 | 说明 |
---|---|
groupId version |
项目相关的内容。可以重写,默认父类的值 |
properties |
父级工程在 properties 标签中定义的变量,子工程使用 ${} 使用 |
dependencies |
相当于强制继承,子工程中一定被导入父工程该标签内的 Jar 包 |
dependencyManagement |
常用的一种统一资源的继承方式,只会继承版本而不会强制让子工程依赖资源 子工程通过在 dependency 内添加 groupId 和 artifactId 即可,当然也可以重写 version 版本号 |
build pluginManagement |
如上的一种统一资源的继承方式,其使用如上,不仅继承版本号,还会继承声明的使用方式 |
继承的实现需要子项目声明父项目,注意 Maven
是单继承,其声明方式如下:
xml复制代码
<parent>
<groupId>org.example.parentgroupId>
<artifactId>demo-parentartifactId>
<version>1.0.0.RELEASEversion>
<relativePath>../parent/pom.xmlrelativePath>
parent>
只是子项目声明了父项目是谁,父项目不需要知道被谁继承了
Maven
提供属性管理,其管理方式属性类型有:自定义属性、内置属性、Setting属性、Java系统属性、环境变量属性
xml复制代码
<properties>
<mybatis-plus.version>3.1.2mybatis-plus.version>
<druid.version>1.1.17druid.version>
properties>
<version>${druid.version}version>
Maven
提供资源加载属性值功能,其为项目内的其他资源文件使用定义的自定义属性,调用方式相同 ${}
使用如下
xml复制代码
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resourcesdirectory>
<filtreing>true<filtering>
resource>
resources>
build>
版本管理含
RELEASE
和SNAPSHOT
,正式版、快照版
Maven
可以进行多环境配置参数,通过打包命令添加参数完成,可了解一下
【Nexus
】为常用私服,安装及使用绕道参考
更改编译 Java
源码的 jdk
版本
xml复制代码
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>utf-8encoding>
configuration>
plugin>
plugins>
build>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
properties>
更改 Maven
默认的 JDK
版本,更改 Maven
目录下的 conf/settings.xml
文件,以后建立的项目源码编译都是指定的 jdk
版本
xml复制代码<profile>
<id>jdk-1.8id>
<activation>
<activeByDefault>trueactiveByDefault>
<jdk>1.8jdk>
activation>
<properties>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<maven.compiler.compilerVersion>1.8maven.compiler.compilerVersion>
properties>
profile>
xml复制代码
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<configuration>
<skipTests>trueskipTests>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-deploy-pluginartifactId>
<configuration>
<skip>trueskip>
configuration>
plugin>
Appassembler
打包有三种核心打包方式,其中常用打包为可执行程序和守护服务方式。如下介绍最为常用的守护方式,该方式可生成资源后直接在服务器中运行为服务
Appassembler
打包方式的优点:
wrapper
方式进行管理,直接运行 bin/
下的可执行文件 start | stop | console | restart
lib
依赖,其打包方式不会将所有依赖打包到一个可执行文件中,分包管理,方便更改部分 jar
包代码,进行部分更新conf/
文件夹下的资源/配置文件,当找不到时才找 jar
包内资源jar
包覆盖到 lib/
下conf/
xxx restart
重启服务xml复制代码
<name>demoname>
<properties>
<appassembler.out.name>appassembler-outappassembler.out.name>
properties>
<plugin>
<groupId>org.codehaus.mojogroupId>
<artifactId>appassembler-maven-pluginartifactId>
<version>2.1.0version>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>generate-daemonsgoal>
goals>
execution>
executions>
<configuration>
<target>${project.build.directory}/${appassembler.out.name}target>
<binFolder>binbinFolder>
<logsDirectory>logslogsDirectory>
<repositoryName>librepositoryName>
<configurationDirectory>confconfigurationDirectory>
<configurationSourceDirectory>src/main/resourcesconfigurationSourceDirectory>
<includeConfigurationDirectoryInClasspath>trueincludeConfigurationDirectoryInClasspath>
<copyConfigurationDirectory>truecopyConfigurationDirectory>
<repositoryLayout>flatrepositoryLayout>
<daemons>
<daemon>
<id>${project.name}id>
<mainClass>org.example.StartermainClass>
<jvmSettings>
<maxStackSize>128maxStackSize>
<extraArguments>
<extraArgument>-serverextraArgument>
<extraArgument>-XX:+AggressiveOptsextraArgument>
<extraArgument>-Xmx1GextraArgument>
<extraArgument>-XX:+HeapDumpOnOutOfMemoryErrorextraArgument>
extraArguments>
jvmSettings>
<platforms>
<platform>jswplatform>
platforms>
<generatorConfigurations>
<generatorConfiguration>
<generator>jswgenerator>
<includes>
<include>linux-x86-64include>
<include>windows-x86-64include>
includes>
<configuration>
<property>
<name>configuration.directory.in.classpath.firstname>
<value>confvalue>
property>
<property>
<name>set.default.REPO_DIRname>
<value>libvalue>
property>
<property>
<name>wrapper.logfilename>
<value>logs/wrapper-${project.name}.logvalue>
property>
<property>
<name>wrapper.logfile.formatname>
<value>Mvalue>
property>
<property>
<name>wrapper.logfile.maxsizename>
<value>10mvalue>
property>
<property>
<name>wrapper.logfile.maxfilesname>
<value>5value>
property>
<property>
<name>wrapper.ntservice.interactivename>
<value>truevalue>
property>
configuration>
generatorConfiguration>
generatorConfigurations>
daemon>
daemons>
configuration>
plugin>
该插件可能与
Spring Boot
打包插件冲突,如出现找不到主类清单错误,可选择注释掉Spring Boot
打包插件(spring-boot-maven-plugin
)
Assembly
打包是 Maven
提供的一种打包方式,可以输出自定义的包类型。如上输出守护服务的资源后,可以再通过该插件进行打包输出
xml复制代码
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-assembly-pluginartifactId>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>singlegoal>
goals>
execution>
executions>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly-linux.xmldescriptor>
<descriptor>src/main/assembly/assembly-win.xmldescriptor>
descriptors>
configuration>
plugin>
描述文件用于描述输出文件,如下输出两个压缩文件(文件内容来自上个插件的输出结果)
xml复制代码
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>linuxid>
<includeBaseDirectory>falseincludeBaseDirectory>
<formats>
<format>tar.gzformat>
formats>
<fileSets>
<fileSet>
<directory>${project.build.directory}/${appassembler.out.name}/jsw/${project.name}/bindirectory>
<outputDirectory>${project.name}/binoutputDirectory>
<fileMode>0755fileMode>
<includes>
<include>${project.name}include>
<include>wrapper-linux*include>
includes>
fileSet>
<fileSet>
<directory>${project.build.directory}/${appassembler.out.name}/jsw/${project.name}/libdirectory>
<outputDirectory>${project.name}/liboutputDirectory>
<includes>
<include>*.jarinclude>
<include>libwrapper-linux*include>
includes>
fileSet>
<fileSet>
<directory>${project.build.directory}/${appassembler.out.name}/jsw/${project.name}/confdirectory>
<outputDirectory>${project.name}/confoutputDirectory>
<includes>
<include>*.ymlinclude>
<include>banner.txtinclude>
<include>wrapper.confinclude>
includes>
fileSet>
<fileSet>
<directory>${project.build.directory}/${appassembler.out.name}/jsw/${project.name}/logsdirectory>
<outputDirectory>${project.name}/logsoutputDirectory>
<excludes>
<exclude>**/*exclude>
excludes>
fileSet>
fileSets>
assembly>
xml复制代码
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>winid>
<includeBaseDirectory>falseincludeBaseDirectory>
<formats>
<format>zipformat>
formats>
<fileSets>
<fileSet>
<directory>${project.build.directory}/${appassembler.out.name}/jsw/${project.name}/bindirectory>
<outputDirectory>${project.name}/binoutputDirectory>
<fileMode>0755fileMode>
<includes>
<include>${project.name}include>
<include>wrapper-windows*include>
includes>
fileSet>
<fileSet>
<directory>${project.build.directory}/${appassembler.out.name}/jsw/${project.name}/libdirectory>
<outputDirectory>${project.name}/liboutputDirectory>
<includes>
<include>*.jarinclude>
<include>libwrapper-windows*include>
includes>
fileSet>
<fileSet>
<directory>${project.build.directory}/${appassembler.out.name}/jsw/${project.name}/confdirectory>
<outputDirectory>${project.name}/confoutputDirectory>
<includes>
<include>*.ymlinclude>
<include>banner.txtinclude>
<include>wrapper.confinclude>
includes>
fileSet>
<fileSet>
<directory>${project.build.directory}/${appassembler.out.name}/jsw/${project.name}/logsdirectory>
<outputDirectory>${project.name}/logsoutputDirectory>
<excludes>
<exclude>**/*exclude>
excludes>
fileSet>
fileSets>
assembly>
Maven
项目默认资源在 src/main/resources
目录下,如果资源不在此目录下,需要添加 maven-resources-plugin
插件,并在 resource
中配置资源路径
xml复制代码
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
plugin>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
resource>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.xmlinclude>
includes>
resource>
resources>
下面介绍的是 tomcat7
插件在 pom.xml
文件中的配置,端口默认是 8080
,path
默认是项目名称(可以在 configuration
标签内进行修改)。执行命令 mvn tomact7:run
运行
xml复制代码
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.1version>
<configuration>
<port>8080port>
<uriEncoding>UTF-8uriEncoding>
configuration>
plugin>
build>
plugins>
Maven
本地仓库同步的时候会产生很多不存在的 Jar
包下载准备文件,可以通过该命令行脚本进行清理,保存到 .bat
文件中,在 windows
双击使用
bash复制代码set REPOSITORY_PATH=E:\MavenRepo
rem 正在搜索...
for /f "delims=" %%i in ('dir /b /s "%REPOSITORY_PATH%\*lastUpdated*"') do (
del /s /q %%i
)
rem 搜索完毕
pause