Maven基础(2):GAV坐标/Repository/Lifecycle/plugin

编程入门 行业动态 更新时间:2024-10-26 22:30:52

Maven基础(2):GAV<a href=https://www.elefans.com/category/jswz/34/1771040.html style=坐标/Repository/Lifecycle/plugin"/>

Maven基础(2):GAV坐标/Repository/Lifecycle/plugin


本文介绍Maven中重要的Coordinates坐标/Repository/Lifecyle/plugin相关概念,并用一个简单的demo来看一下maven是如何动作的。

Maven GAV坐标(Cooridinates)

Maven坐标是用唯一标示我们的某一构件的,它主要由GroupId/ArtifactId/Version三点构成。

项目解释
Group ID组织机构/顶层项目
ArtifactID项目/库
Version唯一发行版本号

Repository

Maven有Local Repository和Remote Repository。本地仓库,在第一次执行maven命令时才会被创建。它可以通过修改settings.xml文件中的localRepository进行设定。
个体用户下.m2/的settings.xml设定范围影响此用户,而Maven的conf/settings.xml则影响所有用户。
而Remote Repository有分成如下三种

项目解释
中央仓库默认的远程仓库
私库由于内网/速度/特定版本需求/第三方组件管理等特定需求,自行架设的仓库。一般使用Nexus/Artifactory等创建
其它公共库默认的中央仓库以外的其它公共库

如下是经常用到的缺省中央仓库的检索URL

Lifecycle

在理解Lifecycle之前需要先行理解Phase的概念,Maven相关的Phase非常的多。Phase将构建中可能的动作抽象出来而形成,从重要的编译/测试到拷贝资源文件这样极小的一个处理动作。比如常见的Phase有如下之多。

非常复杂和繁琐,不同的Lifecycle可以不同的Phase组合而成,加剧了复杂化。Maven的引入是为了方便构建,所以对于大部分都很简单的需求,约定优于配置的思想再次发挥了强大的作用。
比如在这里,Maven的缺省内建了三个Lifecyle:clean/default/site。最为常用的default,在上图中标出的内容极为其所含括的Phase。

创建一个简单的pom工程

[root@liumiaocn ~]# mvn archetype:generate
[INFO] Scanning for projects…
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) > generate-sources @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO]
[INFO] — maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom —
[INFO] Generating project in Interactive mode

1750: remote -> us.fatehi:schemacrawler-archetype-plugin-lint (-)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 909: 此处输入909
Choose org.apache.maven.archetypes:maven-archetype-quickstart version:
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: 选择6
Define value for property ‘groupId’: : com.liumiaocn.demo.maven
Define value for property ‘artifactId’: : mvndemo
Define value for property ‘version’: 1.0-SNAPSHOT: :
Define value for property ‘package’: com.liumiaocn.demo.maven: :
Confirm properties configuration:
groupId: com.liumiaocn.demo.maven
artifactId: mvndemo
version: 1.0-SNAPSHOT
package: com.liumiaocn.demo.maven
Y: : Y
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /root
[INFO] Parameter: package, Value: com.liumiaocn.demo.maven
[INFO] Parameter: groupId, Value: com.liumiaocn.demo.maven
[INFO] Parameter: artifactId, Value: mvndemo
[INFO] Parameter: packageName, Value: com.liumiaocn.demo.maven
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /root/mvndemo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Pom文件

<project xmlns=".0.0" xmlns:xsi=""xsi:schemaLocation=".0.0 .0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.liumiaocn.demo.maven</groupId><artifactId>mvndemo</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>mvndemo</name><url>;/url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies>
</project>

mvn install

实施到install 各Phase的具体内容如下

[root@liumiaocn mvndemo]# mvn install
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building mvndemo 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mvndemo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /root/mvndemo/src/main/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ mvndemo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /root/mvndemo/target/classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ mvndemo ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /root/mvndemo/src/test/resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ mvndemo ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /root/mvndemo/target/test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mvndemo ---
[INFO] Surefire report directory: /root/mvndemo/target/surefire-reports-------------------------------------------------------T E S T S
-------------------------------------------------------
Running com.liumiaocn.demo.maven.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.012 secResults :Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ mvndemo ---
[INFO] Building jar: /root/mvndemo/target/mvndemo-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.4:install (default-install) @ mvndemo ---
[INFO] Installing /root/mvndemo/target/mvndemo-1.0-SNAPSHOT.jar to /root/.m2/repository/com/liumiaocn/demo/maven/mvndemo/1.0-SNAPSHOT/mvndemo-1.0-SNAPSHOT.jar
[INFO] Installing /root/mvndemo/pom.xml to /root/.m2/repository/com/liumiaocn/demo/maven/mvndemo/1.0-SNAPSHOT/mvndemo-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

Plugin

Maven和基于Task的Ant不同,Plugin在Maven中扮演了一个非常重要的角色。Maven本质上可以理解为一个插件的框架,具体的构建任务最终都是由不同的Plugin来文成的。比如对资源的处理是通过maven-resources-plugin,
编译是通过maven-compiler-plugin,测试则是通过maven-surefire-plugin来完成的。而在Maven中使用插件的方式也有两种

方式详细
方式1绑定Lifecycle的Phase,其实Maven缺省的实现正是将Lifecycle的不同Phase和Plugin进行绑定来实现的。
方式2在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标

常用的Maven插件

插件链接说明
maven-antrun-plugin/在Maven项目中运行Ant任务,通常与生命周期绑定运行。
maven-archetype-plugin/mvn archetype:generate可以生成一个很简单的Maven项目原形
maven-assembly-plugin/maven-assembly-plugin的用途是制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。 maven-assembly-plugin支持各种主流的格式如zip、tar.gz、jar和war等,具体打包哪些文件是高度可控的,例如用户可以 按文件级别的粒度、文件集级别的粒度、模块级别的粒度、以及依赖级别的粒度控制打包,此外,包含和排除配置也是支持的。maven-assembly- plugin要求用户使用一个名为assembly.xml的元数据文件来表述打包,它的single目标可以直接在命令行调用,也可以被绑定至生命周期。
maven-dependency-plugin/maven-dependency-plugin最大的用途是帮助分析项目依赖,dependency:list能够列出项目最终解析到的依赖列表,dependency:tree能进一步的描绘项目依赖树,dependency:analyze可以告诉你项目依赖潜在的问题,如果你有直接使用到的却未声明的依赖,该目标就会发出警告。maven-dependency-plugin还有很多目标帮助你操作依赖文件,例如dependency:copy-dependencies能将项目依赖从本地Maven仓库复制到某个特定的文件夹下面。
maven-help-plugin/maven-help-plugin是一个小巧的辅助工具,最简单的help:system可以打印所有可用的环境变量和Java系统属性。help:effective-pom和help:effective-settings最 为有用,它们分别打印项目的有效POM和有效settings,有效POM是指合并了所有父POM(包括Super POM)后的XML,当你不确定POM的某些信息从何而来时,就可以查看有效POM。有效settings同理,特别是当你发现自己配置的 settings.xml没有生效时,就可以用help:effective-settings来验证。此外,maven-help-plugin的describe目标可以帮助你描述任何一个Maven插件的信息,还有all-profiles目标和active-profiles目标帮助查看项目的Profile。
maven-release-plugin/maven-release-plugin的用途是帮助自动化项目版本发布,它依赖于POM中的SCM信息。release:prepare用来准备版本发布,具体的工作包括检查是否有未提交代码、检查是否有SNAPSHOT依赖、升级项目的SNAPSHOT版本至RELEASE版本、为项目打标签等等。release:perform则 是签出标签中的RELEASE源码,构建并发布。版本发布是非常琐碎的工作,它涉及了各种检查,而且由于该工作仅仅是偶尔需要,因此手动操作很容易遗漏一 些细节,maven-release-plugin让该工作变得非常快速简便,不易出错。maven-release-plugin的各种目标通常直接在 命令行调用,因为版本发布显然不是日常构建生命周期的一部分。
maven-surefire-plugin/可能是由于历史的原因,Maven 2/3中用于执行测试的插件不是maven-test-plugin,而是maven-surefire-plugin。其实大部分时间内,只要你的测试 类遵循通用的命令约定(以Test结尾、以TestCase结尾、或者以Test开头),就几乎不用知晓该插件的存在。然而在当你想要跳过测试、排除某些 测试类、或者使用一些TestNG特性的时候,了解maven-surefire-plugin的一些配置选项就很有用了。例如 mvn test -Dtest=FooTest 这样一条命令的效果是仅运行FooTest测试类,这是通过控制maven-surefire-plugin的test参数实现的。
build-helper-maven-plugin/Maven默认只允许指定一个主Java代码目录和一个测试Java代码目录,虽然这其实是个应当尽量遵守的约定,但偶尔你还是会希望能够指定多个 源码目录(例如为了应对遗留项目),build-helper-maven-plugin的add-source目标就是服务于这个目的,通常它被绑定到 默认生命周期的generate-sources阶段以添加额外的源码目录。需要强调的是,这种做法还是不推荐的,因为它破坏了 Maven的约定,而且可能会遇到其他严格遵守约定的插件工具无法正确识别额外的源码目录。build-helper-maven-plugin的另一个非常有用的目标是attach-artifact,使用该目标你可以以classifier的形式选取部分项目文件生成附属构件,并同时install到本地仓库,也可以deploy到远程仓库。
exec-maven-plugin/exec-maven-plugin很好理解,顾名思义,它能让你运行任何本地的系统程序,在某些特定情况下,运行一个Maven外部的程序可能就是最简单的问题解决方案,这就是exec:exec的 用途,当然,该插件还允许你配置相关的程序运行参数。除了exec目标之外,exec-maven-plugin还提供了一个java目标,该目标要求你 提供一个mainClass参数,然后它能够利用当前项目的依赖作为classpath,在同一个JVM中运行该mainClass。有时候,为了简单的 演示一个命令行Java程序,你可以在POM中配置好exec-maven-plugin的相关运行参数,然后直接在命令运行 mvn exec:java 以查看运行效果。
jetty-maven-plugin在进行Web开发的时候,打开浏览器对应用进行手动的测试几乎是无法避免的,这种测试方法通常就是将项目打包成war文件,然后部署到Web容器 中,再启动容器进行验证,这显然十分耗时。为了帮助开发者节省时间,jetty-maven-plugin应运而生,它完全兼容 Maven项目的目录结构,能够周期性地检查源文件,一旦发现变更后自动更新到内置的Jetty Web容器中。做一些基本配置后(例如Web应用的contextPath和自动扫描变更的时间间隔),你只要执行 mvn jetty:run ,然后在IDE中修改代码,代码经IDE自动编译后产生变更,再由jetty-maven-plugin侦测到后更新至Jetty容器,这时你就可以直接 测试Web页面了。需要注意的是,jetty-maven-plugin并不是宿主于Apache或Codehaus的官方插件,因此使用的时候需要额外 的配置settings.xml的pluginGroups元素,将org.mortbay.jetty这个pluginGroup加入。
versions-maven-plugin/很多Maven用户遇到过这样一个问题,当项目包含大量模块的时候,为他们集体更新版本就变成一件烦人的事情,到底有没有自动化工具能帮助完成这件 事情呢?(当然你可以使用sed之类的文本操作工具,不过不在本文讨论范围)答案是肯定的,versions-maven- plugin提供了很多目标帮助你管理Maven项目的各种版本信息。例如最常用的,命令 mvn versions:set -DnewVersion=1.1-SNAPSHOT 就能帮助你把所有模块的版本更新到1.1-SNAPSHOT。该插件还提供了其他一些很有用的目标,display-dependency- updates能告诉你项目依赖有哪些可用的更新;类似的display-plugin-updates能告诉你可用的插件更新;然后use- latest-versions能自动帮你将所有依赖升级到最新版本。最后,如果你对所做的更改满意,则可以使用 mvn versions:commit 提交,不满意的话也可以使用 mvn versions:revert 进行撤销。

Plugin参考

方式详细
Maven Plugin详细.html
Maven Plugin 详细.html

参考文档

参考文档
/
.html

更多推荐

Maven基础(2):GAV坐标/Repository/Lifecycle/plugin

本文发布于:2024-02-12 08:38:08,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1686998.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:坐标   基础   GAV   Maven   Lifecycle

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!