Maven概述

456 阅读4分钟

Maven下载地址maven.apache.org/

Maven安装及配置

将下载的压缩包解压,并配置环境变量

  1. 新建环境变量M2_HOME,变量值为:Maven解压路径;
  2. 在环境变量PATH中,在结尾处新增%M2_HOME%\bin;
  3. 在DOS窗口中,执行mvn -v命令查看是否配置成功

内存配置

当在项目较大时,使用Maven生成站点需要较大的内存,可能会提示OutOfMemeoryError,此时可以配置环境变量 MAVEN_OPTS,值设置-Xms128m -Xmx512m

代理配置

如果Maven连不上网络,需要代理的话,可以 在~/.m2/setting.xml中进行配置,配置如下:

<proxies>
    <proxy>
        <!-- 唯一标识 -->
        <id></id>
        <!-- 是否激活 boolean -->
        <active></active>
        <!-- 代理协议,通常使用HTTP -->
        <protocol></protocol>
        <!-- 主机名 -->
        <host></host>
        <!-- 端口 -->
        <port></port>
        <!-- 认证用户名 -->
        <username></username>
        <!-- 认证密码 -->
        <password></password>
        <!-- 设置不需要代理的域名 -->
        <nonProxyHosts></nonProxyHosts>
    </proxy>
</proxies>

Maven仓库

中央仓库地址: repo1.maven.org/maven2
设置本地仓库地址

在setting.xml中设置
<localRepository></localRepository>

远程仓库配置请参考代码 远程仓库认证信息配置如下:

在setting.xml中配置
<servers>
    <server>
        <!-- pom文件中远程仓库的ID -->
        <id></id>
        <!-- 用户名 -->
        <username></username>
        <!-- 密码 -->
        <password></password>
    </server>
</servers>

Maven镜像

如需配置镜像服务,则在setting.xml中配置如下

<mirrors>
    <mirror>
        <!-- 镜像地址唯一标识 -->
        <id></id>
        <!-- 镜像描述 -->
        <name></name>
        <!-- 镜像地址 -->
        <url></url>
        <!-- 镜像代理地址,通过ID表示,*表示所有 -->
        <mirrorOf></mirrorOf>
    </mirror>
</mirros>

Maven元素

<project>
    <!-- 固定值 -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 所属项目,必选 -->
    <groupId>com.xxx</groupId>
    <!-- 模块名称,必选 -->
    <artifactId>xxx</artifactId>
    <!-- 版本,SNAPSHOT表示快照,必选 -->
    <version>0.0.1-SNAPSHOT</version>
    <!-- 打包方式,默认为jar,可选 -->
    <packaging>jar</packaging>
    
    <name></name>
    <url>http://maven.apache.org</url>
    <!-- 如果需要引用父maven,则使用如下标签 -->
    <parent>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
        <!-- 父类pom文件相对位置,默认为../pom.xml,即在上一层目录中 -->
        <relativePath></relativePath>
    </parent>
    <!-- 属性 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
        <!-- 依赖的jar包groupId -->
            <groupId></groupId>
            <!-- 依赖的jar包artifactId -->
            <artifactId></artifactId>
            <!-- 依赖的jar包版本号 -->
            <version></version>
            <!-- 依赖的范围,参考 -->
            <scope></scope>
            <!-- 标记依赖是否可选,true表示该依赖只对当前项目有效,不会传递 -->
            <optional></optional>
            <!-- 排除传递依赖 -->
            <exclusions>
                <exclusion>
                    <groupId></groupId>
                    <artifactId></artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <!-- 部署到远程仓库 -->
    <distributionManagement>
        <repository>
            <id></id>
            <name></name>
            <url></url>
        </repository>
        <snapshotRepository>
            <id></id>
            <name></name>
            <url></url>
        </snapshotRepository>
    </distributionManagement>
    <!-- 远程仓库配置 -->
    <repositories>
        <repository>
            <!-- 远程仓库唯一标识 -->
            <id></id>
            <!-- 远程仓库描述 -->
            <name></name>
            <!-- 远程仓库地址 -->
            <url></url>
            <!-- 远程仓库发布版本下载支持 -->
            <releases>
                <enabled>true</enabled>
            </releases>
            <!-- 远程仓库快照版本下载支持 -->
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <!-- default表示仓库的布局是Maven2及Maven3的默认布局 -->
            <layout>default</layout>
        </repository>
    </repositories>
    <!-- 远程插件仓库配置 -->
    <pluginRepositories>
        <pluginRepository>
            <id></id>
            <name></name>
            <url></url>
        </pluginRepository>
    </pluginRepositories>
    <build>
        <!-- 自定义源码目录 -->
        <sourceDirectory></sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <!-- 该插件默认只支持编译1.3,需要重新配置 -->
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Maven命令

  • mvn clean deploy:将项目输出的构件部署到远程仓库

Maven依赖范围

  • compile: 编译依赖范围,对于编译、测试、运行有效
  • test:测试依赖范围,只对测试有效
  • provided:已提供依赖范围,对于编译和测试有效
  • runtime:运行时依赖范围,对于测试和运行有效
  • system:系统依赖范围,对于编译和测试有效,不过该依赖范围必须通过systemPath元素显式指定依赖文件的路径,而且往往与本机系统绑定,不可移植,不建议使用

Maven资源过滤及构建

即可以使用Maven中的属性值替换配置文件中的值

Maven属性

  • 内置属性,示例
    ${basedir}:项目根目录
    ${version}:项目版本号
  • pom属性,示例
    ${project.build.sourceDirectory}:项目主源码目录
    ${project.artifactId}:项目的artifactId
    ${project.build.sourceDirectory}:项目的主源码目录
    ${project.build.directory}:项目构建输出目录
    ${project.build.finalName}:项目打包输出文件的名称
  • 自定义属性
  • Java系统属性,通过mvn help:system查看所有的Java系统属性
  • 环境变量属性,以env.开头的属性引用
  • setting属性,通过settings.开头引用xml元素的值

Maven资源过滤

在Maven中定义的属性只有在POM中才会被解析,如果想在配置文件中使用Maven中定义的属性时,则需要开启资源过滤,资源过滤的POM配置如下:

<!-- 资源文件过滤 -->
<build>
    <resources>
        <resource>
            <!-- 资源路径 -->
            <directory></directory>
            <filtering>true</filtering>
            <!-- 排除的资源文件 -->
            <excludes>
	        <exclude>src/main/filter</exclude>
	    </excludes>
        </resource>
    </resources>
</build>
<!-- 针对不同环境的不同配置 -->
<profiles>
    <profile>
        <id>dev</id>
        <!-- 配置的属性值 -->
        <properties></properties>
        <!-- 默认激活 -->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <!-- 针对单个profile资源过滤 -->
        <build>
            <filters>
	        <filter>src/main/filter/dev_filter.properties</filter>
	    </filters>
        </build>
    </profile>
</profiles>

Maven聚合

新建项目,之包含pom.xml,其中<packaging>元素设置为pom,在聚合中,最主要的元素为

<modules>
    <!-- 聚合的模块名称 -->
    <module></module>
        ...
    <module></module>
</modules>

Maven继承

继承与聚合一样,<packaging>元素设置为pom,子pom如果需要继承父pom中的元素,则在子pom中配置<parent>元素,具体参考配置,可继承的元素如下:

  • groupId 项目组ID
  • version 版本信息
  • description 项目描述
  • organization 项目组织信息
  • inceptionYear 创始年份
  • url 项目Url地址
  • developers 开发者信息
  • contributors 贡献者信息
  • distributionManagement 部署配置
  • issueManagement 缺陷跟踪系统信息
  • ciManagement 持续集成系统信息
  • scm 版本控制系统信息
  • mailingLists 邮件列表信息
  • properties 自定义属性
  • dependencies 依赖配置
  • dependencyManagement 依赖管理配置
  • repositories 仓库配置
  • build 项目构建信息
  • reporting 项目报告输出配置

在父模块中,元素<dependencyManagement>既能让子模块继承到父模块的依赖配置,又能保证子模块依赖使用的灵活性,因为该元素下的依赖声明不会引入实际的依赖,不过它能够约束dependencies的依赖使用,即子类要重写父依赖的groupId和artifactId元素。同理,元素<pluginManagement>能让子模块继续到父模块的插件配置

备注: 依赖范围import只有在dependencyManagement中才有效,该依赖范围通常指向一个POM,作用是将目标POM中的dependencyManagement配置导入合并到当前POM的dependencyManagement元素中。

Maven常用插件

编译插件

<build>
    <plugins>
        <!-- 用来编译Java代码 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <!-- 支持的java版本 -->
                <source>1.7</source>
                <target>1.7</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
        <!--处理资源文件 -->
        <plugin>
    	    <groupId>org.apache.maven.plugins</groupId>
    	    <artifactId>maven-resources-plugin</artifactId>
    	    <version>2.6</version>
    	    <configuration>
    	        <encoding>UTF-8</encoding>
    	    </configuration>
        </plugin>
        <!-- 对web资源进行过滤 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1-beta-1</version>
            <configuration>
                <webResources>
                    <resource>
                        <filtering>true</filtering>
                        <directory>src/main/webapp</directory>
                        <!-- 过滤的目录 -->
                        <includes>
                            <include>* */*.css</include>
                            <include>* */*.js</include>
                        </includes>
                    </resource>
                </webResources>
            </configuration>
        </plugin>
        <!-- 生成可执行的jar文件,即将main方法添加到mainfest中 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.xxx.xxx</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- 将Spring Boot应用打包为可执行的jar或war文件,然后以通常的方式运行Spring Boot应用 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Maven常用命令

mvn dependency:list 查看当前项目已解析依赖
mvn dependency:tree 查看当前项目依赖树
mvn dependency:analyze 分析当前项目依赖树\

Maven私服全局配置

在setting.xml配置镜像,同时配置私服地址如下

<profiles>
    <profile>
        <id>nexus</id>
        <!-- 如下配置请参考Maven元素远程仓库配置 -->
        <repository>
        </repository>
    </profile>
</profiles>
<!-- 激活的私服ID -->
<activeProfiles>
    <activeProfile>nexus</activeProfile>
</activeprofiles>