maven总结(旧工程转maven项目)

需求:lib升级管理不方便,转为maven项目,方便管理。
解决方案:maven提倡的是"约定优于配置",而目前项目的目录结构不符合maven约定,在不进行大的代码改动的情况下转成maven项目,需要增加一些额外的自定义配置,在后期的实践中再慢慢移除。
注意:新建的maven项目,一定要遵守 maven 的约定,可以节省大量的配置。


将当前项目转为maven项目的几个步骤:

  1. 增加pom.xml文件
  2. 根据已有项目目录,使用pom.xml进行自定义配置
  3. 根据原来的ant的build.xml打包脚本,使用maven打包

maven总结

项目坐标

任何一个构件在maven中都有自己唯一的坐标.

<groupId>com.github.sso</groupId>
<artifactId>sso</artifactId>
<version>1.0</version>
<packaging>war</packaging>
  • groupId 当前maven项目隶属的实际项目.通常为公司域名道写+所在项目组
  • artifactId 定义实际项目中的一个maven项目(模块).通常使用实际项目(模块)名称
  • version 当前项目版本号
  • packaging maven项目的打包方式,默认为jar

依赖的配置

<dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1</version>
    <exclusions>
        <exclusion>
            <groupId>avalon-framework</groupId>
            <artifactId>avalon-framework</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • groupId,artifactId,version 依赖的基本坐标
  • type 依赖的类型,对应于项目坐标中的packaging,默认为jar
  • scope 依赖的范围
  • optional 标记依赖是否可选
  • exclusions 用来排除依赖性传递

依赖范围

maven中有三个classpath

  • 编译项目主代码的时候使用一套classpath
  • 编译和执行测试时使用一套classpath
  • 编译和执行测试时使用一套classpath

依赖范围就是用来控制依赖与这三种classpath的关系.maven中有如下几种依赖关系:

  • compile 编译依赖范围,默认使用.对编译,测试,运行classpath都有效
  • test 测试依赖范围.只对测试classpath有效,例如:JUnint
  • provided 编译和测试classpath有效,运行时无效.例如:servlet-api
  • runtime 运行时有效.例如:mysql的JDBC驱动实现包
  • system 和provided依赖范围一样.但是,system的使用必须和systemPath配合.
    <dependency>
        <groupId>jcifs</groupId>
        <artifactId>jcifs</artifactId>
        <scope>system</scope>
        <systemPath>${project.basedir}/lib/jcifs-1.2.15.jar</systemPath>
        <version>1.2.15</version>
    </dependency>
    
  • import

依赖传递性

A --> B --> C 假设A依赖于B,B依赖于C,那么我们说

  • A对于B是第一直接依赖
  • B对于C是第二直接依赖
  • A对于C是递性性依赖

依赖传递规律:

  • 当第二直接依赖是compile时,传递性依赖和第一直接依赖相同
  • 当第二直接依赖是test时,依赖不会传递
  • 当第二直接依赖是provided时,只有道第一直接依赖也是provided时,传递性依赖也为provided,其余情况不传递
  • 当第二直接依赖为runtime时,传递性依赖与第一直接依赖相同;但compile例外,此时传递性依赖为runtime
第一依赖\第二依赖 compile test provided runtime
compile compile - - runtimr
test test - - test
provided provided - provided provided
runtime runtime - - runtime

依赖调解两个原则

  • 路径最近者优先
  • 第一声明者优先

查看依赖

  • mvn dependency:tree 命令查看maven项目的依赖
  • IntelliJ IDEA工具的Maven Projects窗口,选择要分析的maven module,右击show dependencies,会出来该module的全部依赖关系图

仓库和坐标

任何一个构件都有唯一的坐标,根据这个坐标可以确定其在仓库中的唯一存储路径.
该路径与坐标的大致对应关系为groupId/artifactId/version/artifactId-version.jar
例如:log4j:log4j:1.2.15这一依赖,其对应仓库的路径为:/log4j/log4j/1.2.15/log4j-1.2.15.jar.

配置settings.xml

maven可以选择配置 $M2_HOME/config/settings.xml 或者 ~/.m2/settings.xml
前者是全局范围的,后者是用户范围的.推荐使用后者.若后者文件不存在,可以直接拷贝全局配置到用户配置中,然后进行修改.

本地仓库

如果用户想要自定义本地仓库目录地址,可以在settis.xml文件中设置 localRepository 元素值,默认在 ~/.m2/repository 目录下

<localRepository>~/java/repository</localRepository>

远程仓库

很多情况下,默认的中央仓库无法满足项目的需求,可能需要从别的仓库下载构件.
这时,可以在 pom.xml 中配置所需的仓库.

<repositories>
    <repository>
        <id>nexus</id>
        <name>nexus-aliyun</name>
        <url>>http://maven.aliyun.com/nexus/content/groups/public</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
        </snapshots>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
        </releases>
        <layout>default</layout>
    </repository>
</repositories
  • id : 任何一个仓库的id必须唯一,并且maven自带中央仓库id为central,若其他仓库使用该id就会覆盖中央仓库的配置

  • updatePolicy : maven从远程仓库检查更新的频率

    • daily 默认值.每天检查一次
    • never 从不检查更新
    • always 每次构建都检查更新
    • interval:X 每隔X分钟检查一次
  • checksumPolicy 在下载构件时,maven会校验这些文件

    • warn 默认值.构建时输出警告信息
    • fail 遇到校验错误就构建失败
    • ignore 完全忽略校验和错误

远程仓库认证

对于一些远程仓库的访问,我们可能需要进行身份认证.

注意:仓库配置信息可以直接配置在pom.xml中,但是认证信息必须配置在settings.xml文件中.

<servers>
    <server>
        <id>nexus</id>
        <username>your username</username>
        <password>your pwd</password>
    </server>
<servers>

server元素的id必须和pom文件中需要认证的repository元素的id相同.

部署至远程仓库

在开发中,我们的项目可能需要部署到仓库中,供其他团队成员使用.这时,可以在 pom.xml 中配置distributionManagement元素.

<distributionManagement>
    <repository>
        <id>deploy_releases</id>
        <url>http://192.168.1.101/nexus/content/repositories/releases/</url>
    </repository>
</distributionManagement>

如果往仓库需要身份认证,可以参看上文的认证方式.

镜像配置

如果仓库A可以提供仓库B存储的所有内容,那么就可以认为A是B的一个镜像.
可以在 settings.xml 文件中,配置所要使用的镜像.

<mirrors>
    <mirror>
        <id>nexus-aliyun</id>
        <mirrorOf>*,!repo.jenkins-ci.org,!local-nexus,!maven-nexus</mirrorOf>
        <name>Nexus aliyun</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
</mirrors>
  • <mirrorOf></mirrorOf>元素值说明
    • * 该镜像匹配所有远程仓库
    • external:* 匹配所有不在本机上的远程仓库
    • repo1,repo2 匹配仓库repo1和repo2
    • *,!repo1 匹配除了repo1仓库外的所有远程仓库

注意:由于镜像仓库完全屏蔽了被镜像的仓库,所有当镜像仓库停止服务的时候,maven无法访问镜像仓库,因而无法下载构件

生命周期

maven的生命周期是抽象的,其实际行为都由插件来完成.maven有三套相互独立的生命周期:

  • clean 生命周期: 清理项目
  • default 生命周期: 构件项目
  • site 生命周期: 建立项目站点

每个生命周期都包含一些阶段,这些阶段都是有序的,并且后面的阶段依赖于前面的阶段.

clean 生命周期

Clean生命周期一共包含了三个阶段:

  • pre-clean 执行一些需要在clean之前完成的工作
  • clean 移除所有上一次构建生成的文件
  • post-clean 执行一些需要在clean之后立刻完成的工作

Default生命周期

Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中.

生命周期阶段 描述
validate 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
initialize 初始化构建状态,例如设置属性。
generate-sources 生成编译阶段需要包含的任何源码文件。
process-sources 复制并处理资源文件输出至classpath目录
generate-resources 生成工程包中需要包含的资源文件。
process-resources 拷贝和处理资源文件到目的目录中,为打包阶段做准备。
compile 编译项目源代码
process-classes 处理编译生成的文件,例如 Java Class 字节码的加强和优化。
generate-test-sources 生成编译阶段需要包含的任何测试源代码。
process-test-sources 复制并处理测试资源文件输出至目标测试目录
test-compile 编译测试源代码到测试目的目录。
process-test-classes 处理测试代码文件编译后生成的文件。
test 使用适当的单元测试框架(例如JUnit)运行测试,这些测试代码不会被打包或部署
prepare-package 在真正打包之前,为准备打包执行任何必要的操作。
package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR。
pre-integration-test 在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。
integration-test 处理和部署必须的工程包到集成测试能够运行的环境中。
post-integration-test 在集成测试被执行后执行必要的操作。例如,清理环境。
verify 运行检查操作来验证工程包是有效的,并满足质量要求。
install 将包安装至本地仓库,以让其它项目依赖 。
deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。

注意:当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。不同的 maven 目标将根据打包的类型(JAR / WAR),被绑定到不同的 Maven 生命周期阶段。

Site生命周期

  • pre-site 执行一些需要在生成站点文档之前完成的工作
  • site 生成项目的站点文档
  • post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
  • site-deploy 将生成的站点文档部署到特定的服务器上

命令和生命周期

  • mvn clean 调用clean声明周期的clean阶段.实际执行的是pre-clean 和clean阶段
  • mvn test 调用default生命周期的test阶段.
  • mvn clean install 调用clean声明周期的clean阶段和default生命周期的install阶段

注意:运行任何一个阶段的时候,它前面的所有阶段都会被运行.

常用插件

  • maven-compiler-plugin ,注意修改编译版本.默认为1.5
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>
  • tomcat7-maven-plugin
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <port>8080</port>
        <path>/</path>
    </configuration>
</plugin>
  • maven-surefire-plugin
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <!--表明在构建项目的时候跳过测试,也可以使用启动参数的方式来进行配置:mvn install -Dmaven.test.skip=true ,其本质就是重用了java的启动参数-->
        <skip>true</skip>
    </configuration>
</plugin>
  • maven-antrun-plugin ,可以用来执行ant脚本
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.3</version>
    <executions>
        <execution>
            <id>process-resources-online</id>
            <phase>process-resources</phase>
            <goals>
                <goal>run</goal>
            </goals>
            <configuration>
                <tasks>
                    <echo> execute ant </echo>
                </tasks>
            </configuration>
        </execution>
</plugin>
  • maven-war-plugin
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <outputDirectory>${project.build.directory}/dist</outputDirectory>
        <warName>project</warName>
        <warSourceExcludes>
            /WEB-INF/web-online.xml,
            /WEB-INF/web-test.xml,
            /WEB-INF/web.xml
        </warSourceExcludes>
    </configuration>
</plugin>

maven属性

在maven中一共有六类属性:

  • 内置属性.常用属性: ${basedir} 表示项目根目录,即pom.xml所有目录.
  • pom属性,可以使用该属性引用pom文件中对应的元素值.常用属性:
    • ${project.build.sourceDirectory} 项目主源码目录
    • ${project.build.directory} 项目构建输出目录,默认为 target/
    • ${project.build.outputDirectory} 项目主代码编译输出目录,默认为 target/classes
  • 自定义属性.可以在pom的 <properties> 元素下定义maven属性,通过 ${xx} 来引用属性值,可以消除重复.例如:
    <properties>
        <jdk.version>1.8</jdk.version>
        <org.springframework.version>4.0</org.springframework.version>
        <com.fasterxml.jackson.version>2.6.3</com.fasterxml.jackson.version>
    </properties>
    
  • setting属性.以 setting. 开头的属性引用settings.xml文件中的xml属性值.常用如: ${setting.localRepository}
  • java系统属性.所有java系统属性都可以在maven中应用.例如: ${user.home} 指向了用户目录.
  • 环境变量属性.所有的环境变量属性可以使用 env. 开头的maven属性引用.例如 ${env.JAVA_HOME} 指代了JAVA_HOME环境变量的值.

不同环境的profile

典型的项目开发都会有开发环境,测试环境和产品环境,不同环境的构件也可能是不同的.maven引入了profile的概念,在不同的环境中,激活不同的profile.

<profiles>
    <profile>
        <id>online</id>
        <!-- 线上环境的配置-->
    </profile>
    <profile>
        <id>test</id>
        <!-- 测试环境的配置-->
    </profile>
</profiles>

激活profile

mvn clean install -P test

profile的种类及作用域

  • pom.xml 只对当前项目有效
  • 用户settings.xml 对本机此用户的所有项目有效
  • maven全局setting.xml 对本机所有项目有效

web资源过滤(即wabapp中的资源)

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <!--注意,请使用2.6版本,不同版本似乎存在差异.-->
    <version>2.6</version>
    <configuration>
        <!--webapp目录-->
        <warSourceDirectory>src/main/webapp</warSourceDirectory>
        <!--需要过滤的web资源-->
        <warSourceExcludes>
        <!--
        注意,这里的路径就要这样写,写绝对路径无效...
        不同版本似乎存在差异,使用这个过滤在全局和profile中都设置了
        -->
        /WEB-INF/applicationContext-test.xml,
        /WEB-INF/applicationContext.xml,
        /WEB-INF/cas-test.properties,
        /WEB-INF/cas.properties,
        /WEB-INF/web-online.xml,
        /WEB-INF/web-test.xml,
        /WEB-INF/web.xml
        </warSourceExcludes>
    </configuration>
</plugin>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 简介 概述 Maven 是一个项目管理和整合工具 Maven 为开发者提供了一套完整的构建生命周期框架 Maven...
    闽越布衣阅读 4,272评论 6 39
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,724评论 6 342
  • Maven的基本了解 什么是Maven? Maven就是Apache下的一个开源项目。它是用纯java开发的。是一...
    Bcome阅读 2,770评论 0 7
  • 和自己喜欢的女孩子聊天,整个天空都晴朗了
    丫丫的枝桠阅读 160评论 0 0