Maven简介

Maven简介

什么是Maven

Maven 的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型POM

如图蓝色部分为 Maven,其不包括外部其他部分,上部分为核心,下部分为各种插件。Maven 的作用如下

  • 项目构建: 提供标准的、跨平台的自动化项目构建方式
  • 依赖管理: 方便快捷的管理项目依赖的资源包,避免资源之间的版本冲突问题
  • 统一开发结构: 规定了 srcresourcetarget 等统一项目结构

Maven简介_第1张图片

Maven 是由 Java 语言编写的,同样采用了面向对象的思想

Maven安装

  1. 点击进入 Maven 官网进行下载 maven.apache.org/
  2. 解压文件到没有空格、没有中文的目录下
  3. 【可选】打开 maven目录/conf/settings.xml 配置文件,配置阿里镜像地址(配置到 标签里)
alimaven aliyun maven https://maven.aliyun.com/repository/central/ central

【可选】配置环境变量:新建 MAVEN_HOME:Maven根目录,修改Path添加 %MAVEN_HOME%\bin (注意:Maven 依赖环境变量中有 JAVA_HOME),CMD输入 mvn -v 验证

【可选】因为Java默认的最大可用内存往往不够满足Maven运行需要,比如较大的项目时,使用Maven生成项目站点需要占用大量内存,可选配置 MAVEN_OPTS:-Xms128m -Xmx512m

注意 Maven 是由 Java 研发的,所以 Maven 依赖 Java

Maven概念

仓库概念:仓库用于存储资源(各种 Jar 包),其分为本地仓库远程仓库中央仓库

  • 本地仓库: 自己电脑上存储资源的仓库
  • 远程仓库: 也叫作 Maven 私服,部门/公司范围内储存资源的仓库
  • 中央仓库: Maven 团队维护的,维护所有资源的仓库

坐标概念:坐标用于描述仓库中资源的位置,其构成部分及说明如下:

gourpId`:组织名,定义该 `Maven` 项目隶属组织,常是域名反写,如 `org.example.demo

artifactId:项目名,定义该 Maven 项目名称

version:版本号,定义该 Maven 项目的版本号

packaging:定义项目的打包方式,如成果物类型 warjar,如组织项目的 pom 类型

Jar 包的获取会逐级搜索,如本地仓存在则直接使用本地仓,如不存在则到远程仓获取。以此类推

Maven使用

生命周期命令

生命周期命令

命令 说明
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 本地库中管理的资源发布到远程库中

POM文件结构


<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>

依赖传递

依赖是可以传递的,很有可能会发生依赖传递冲突问题,其优先级如下:

  1. 路径优先: 当依赖中出现相同的资源时(可能版本号不同),层级越浅,优先级越高
  2. 声明优先: 当资源在相同层级被依赖时,配置顺序考前的覆盖配置顺序靠后的
  3. 特殊优先: 当在同 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 引入依赖项目,配合 pom 使用

依赖范围具有传递性,开发时根据实际情况使用

插件使用

插件的使用可以通过官网查询,不同插件有不同使用方式,根据文档说明进行操作。如下简单示例源码插件配置

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>

多模块管理

Model聚合

聚合用于快速构建 Maven 工程,一次性构建多个项目/模块。如多个项目/模块依赖,执行命令时需要每一个工程都进行编译,打包,安装,测试,部署等生命周期的命令,一个一个去执行这些命令效率非常低

Maven 提供了聚合的配置,实现统一执行命令,实现方法:创建一个无代码聚合工程,并在 POM 中配置所有聚合的项目/模块

xml复制代码
<packaging>pompackaging>

<modules>
    
    
    <module>../child1module>
    
    <module>child2module>
  modules>

只是聚合项目关心有什么模块,模块不需要知道被谁聚合了

Maven继承

Maven 项目提供继承的特性,可以利用继承实现所有项目资源版本统一的问题。其继承的父类资源包括:

继承项 说明
groupId version 项目相关的内容。可以重写,默认父类的值
properties 父级工程在 properties 标签中定义的变量,子工程使用 ${} 使用
dependencies 相当于强制继承,子工程中一定被导入父工程该标签内的 Jar
dependencyManagement 常用的一种统一资源的继承方式,只会继承版本而不会强制让子工程依赖资源 子工程通过在 dependency 内添加 groupIdartifactId 即可,当然也可以重写 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>

版本管理含 RELEASESNAPSHOT,正式版、快照版
Maven 可以进行多环境配置参数,通过打包命令添加参数完成,可了解一下

Maven私服

Nexus】为常用私服,安装及使用绕道参考

常用插件使用

JDK版本

更改编译 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 打包有三种核心打包方式,其中常用打包为可执行程序守护服务方式。如下介绍最为常用的守护方式,该方式可生成资源后直接在服务器中运行为服务

Appassembler 打包方式的优点:

  1. 通过 wrapper 方式进行管理,直接运行 bin/ 下的可执行文件 start | stop | console | restart
  2. 分包管理 lib 依赖,其打包方式不会将所有依赖打包到一个可执行文件中,分包管理,方便更改部分 jar 包代码,进行部分更新
  3. 管理资源文件,可以通过设置,让程序首先使用 conf/ 文件夹下的资源/配置文件,当找不到时才找 jar 包内资源
  4. 当更新程序时,操作步骤更为简单:
  5. 把需要更新的 jar 包覆盖到 lib/
  6. 保证是否需要更新配置文件 conf/
  7. 运行可执行文件 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打包

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>

Tomcat插件

下面介绍的是 tomcat7 插件在 pom.xml 文件中的配置,端口默认是 8080path 默认是项目名称(可以在 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

你可能感兴趣的:(后端,maven)