Maven总结

maven 项目骨架生成工具

 mvn archetype:generate

基本约定

  • 源码 src/main/java
  • 资源 src/main/resources
  • 测试源码 src/test/java
  • 测试资源 src/test/resources
  • 编译输出 target/classes
  • 打包 jar
  • 打吧输出 target/
  • webapp资源 webapp/.html webapp/.jsp webapp/img/ webapp/css/ webapp/js/
  • webapp配置 webapp/WEB-INF/web.xml

mvn 构件坐标

通过坐标确定唯一的构件

  • groupId 实际项目, 如SpringFramework
  • artificatId 实际项目下的maven项目(模块),一般以实际项目作前缀,如spring-core
  • version
  • packaging 默认为jar
  • classifier

依赖管理

<dependencies>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

声明依赖的构件的基本坐标

  • groupId
  • artificateId
  • version
    其他属性
  • scope 作用在classpath的范围
  • optional 构件A 的optional 依赖,不传递给依赖构件A的其他构件
  • exclusion 构件A 依赖了构件B,但是排除构件B的某些依赖

传递律

依赖遵循传递律。若存在对同一构件不同版本的依赖则

  1. 依赖路径最短的优先
  2. 最先被读取的依赖优先。

scope

决定依赖是否被添加到对应的编译/测试/运行时的classpath 中。

scope 编译 测试 运行
compile y y y
test y
provided y y
runtime y y
system y y

provided 适用于运行时的库会存在在环境中,比如servlet-api
runtime 适用于编译时只需要interface, 实际运行时才会引入具体实现
system 适用于引用本机系统相关的依赖,依赖不由maven 管理,需要在systemPath 中声明

变量

  • 内置变量 ${basedir} ${version}
  • POM属性 ${project.groupId} (通过 . 来访问pom元素)
  • 自定义属性:<properties> 中的属性, ${ 属性名 }
  • Settings属性:settings 里的属性,通过 ${ settings.??? } 访问
  • Java 属性:所有Java 属性都可以直接访问, 如 ${ user.home }
  • 环境变量: 通过 ${ env.??? } 访问

生命周期

将生命周期的phase 作为参数传递给mvn 执行

mvn clean install

会顺序执行该phase前所有的phase,如mvn clean 会执行pre-clean, clean两个phase

列举三个生命周期中常见的phase

clean 清理

  • pre-clean
  • clean
  • post-clean

default 构建

  • validate
  • process-sources 复制src/main/resources 到classpath
  • compile 编译src/main/java 到classpath
  • process-test-sources 复制测试资源 src/test/resources 到classpath
  • test-compile 编译测试代码 ssrc/test/java 到classpath
  • test 运行单元测试
  • package
  • integration-test
  • verify
  • install 安装到本地仓库
  • deploy 发布到远程仓库

site 建立站点

  • site 生成站点文件
  • site-deploy 发布到服务器上

插件

获取插件信息

mvn help:describe -Dplugin=org.apache.maven.plugins:maven-clean-plugin:3.0.0 -Ddetail

插件定义了可执行的goal,可以通过

mvn {插件前缀}:{goal}
// 如 mvn clean:clean

插件:goal 直接执行
或者将插件绑定在phase 上,在执行phase 的时候执行

<build>
    <plugins>
        <plugin>
            <artifactId>maven-sources-plugin</artifactId>
            <version>3.0.2</version>
            <executions>
                <execution>
                    <id>attach-sources</id>
                    <phase>verify</phase>
                    <goals>
                        <goal>jar-no-fork</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

POM 聚合

将多个模块放到同一aggreator pom中,一次构建就可以构建所有模块

<groupId>com.lxian.playground</groupId>
<artifactId>playground-mvn-aggreator</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
    <module>playground-java</module>
    <module>playground-scala</module>
</modules>
  • packaging 必须为 pom
  • model 的值是该模块相对 aggreator pom的相对路径,比如上面配置的aggreator 应在 playground/pom.xml, 而playground-java 模块在 playgournd/playground-java/pom.xml

POM 继承

常用的可以继承的元素

  • groupId
  • version
  • 各种作者/组织等描述
  • distributionManagement
  • properties
  • dependencies
  • dependencyManagement 只约束依赖的属性(version, scope),子POM可以按需要引入依赖
  • pluginManagement 同上
  • repositories
  • build
    由于不会继承modules 所以所以父pom和aggreator pom 可以为同一个🌚

父pom packaging 需为pom

<groupId>com.lxian.playground</groupId>
<artifactId>playground-mvn-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

子pom 可以指定父pom 的相对路径,默认为 ../pom.xml。如果相对路径上没找到父pom,则会在本地仓库搜索。

<parent>
    <groupId>com.lxian.playground</groupId>
    <artifactId>playground-java</artifactId>
    <version>1.0-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath>
</parent>

仓库配置

坐标与路径

groupId/artifactId/version/artifactId-version.packaging

本地/远程仓库

本地仓库位置

~/.m2/repository

查找顺序

  1. system 依赖,从本地查找
  2. 从本地仓库查找
  3. 从远程仓库查找
  4. 如果是RELEASE 依赖,则读取远程 groupId/artifactId/version/maven-metadata.xml 确定最新发布版
  5. 如果是LATEST, 同上,查找包括snapshot 的最新版
  6. SNAPSHOT 则查找最新的 SNAPSHOT

构件会被先下载到本地再使用

配置

<repositories>
    <repository>
        <id>central</id>
        <name>Maven Central</name>
        <url>http://repo1.maven.org/maven2/</url>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
            <checksumPolicy>ignore</checksumPolicy>
        </releases>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
    </repository>
</repositories>
  • updatePolicy 从远程仓库更新的频率 never/always/daily/interval。always会每次都检查更新

认证

配置在settings.xml (密码和代码分离)

<servers>
  <server>
    <id>my-repo</id>
    <username></username>
    <password></password>
  <server>
</servers>

id 需要和pom repositories 里面的id 对应

部署配置

<distributionManagement>
    <repository>
        <id>my-release-repo</id>
        <name>My Release Repo</name>
        <url></url>
    </repository>
    <snapshotRepository>
        ...
    </snapshotRepository>
</distributionManagement>

Snapshot

Snapshot 的发布,会在版本后带上发布时的时间戳
Snapshot 的依赖会拉去最新的Snapshot 构件

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 简介 概述 Maven 是一个项目管理和整合工具 Maven 为开发者提供了一套完整的构建生命周期框架 Maven...
    闽越布衣阅读 4,261评论 6 39
  • 需求:lib升级管理不方便,转为maven项目,方便管理。解决方案:maven提倡的是"约定优于配置",而目前项目...
    土豆了解一下阅读 1,511评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,562评论 18 139
  • Maven是基于项目对象模型pom,通过一小段信息来管理项目的构建、报告和文档的项目软件管理工具。 maven目录...
    icecrea阅读 334评论 0 0
  • 最近我被同事批评了,让孩子学习那么多兴趣班,孩子该多累呀!我家小宝贝学习的兴趣有画画,舞蹈,电子琴,古筝,唱歌,最...
    燕zi阅读 376评论 1 7