maven教程3_maven-compiler-plugin

                                                                                             原创者:文思


                             org.apache.maven.plugins系列插件简介

一、插件知识简介

简介:

       compiler插件3.0之前,默认的Java编译器就的JDK自带的javac。但是从Compiler插件3.0开始(需要JDK1.6),默认的Java编译器   是javax.tools.JavaCompiler。如果仍然希望使用JDK自带的javac编译源代码,就需要为mvn命令配置forceJavacCompilerUse启动参数如:-Dmaven.compiler.forceJavacCompilerUse=true 

    Compiler插件编译时和编译后运行的JVM版本目前默认的设置为1.5,默认用此版本,而不是根据你项目中指定的jdk版本编译。如果你想改变这些默认设置,你应该设置编译源和目标中java编译器的目标,通过设置Java源代码兼容的JVM版本,标明Java源代码开发过程中使用的Java版本,通过设置编译后的类库拟运行的JVM版本,给出编译后的类库将要运行的Java环境(一般都会设置,因为很少有项目再用1.7以下的版本了):

 同时,命令mvn的运行需要依赖JDK,Compiler插件默认使用当前运行mvn命令的JDK去编译Java源代码。如果想使用其他版本的JDK(比如本地java环境的,而非maven自带的)编译Java源代码,则需要设置如下(重点fork 、executable、compilerVersion):

上述配置中,用以编译Java源代码的是JDK 1.8,运行mvn命令时指定maven所使用的是JDK为1.6

    Compiler插件提供了如下2个goal,默认都已经绑定到Maven的生命周期阶段,无需单独指出。

     compiler:compile,绑定到compile 阶段,用以编译main/路径下的源代码

     compiler:testCompile,绑定到test-compile阶段,用以编译test/路径下的源代码

mvn compile:

 下图看出官网也建议指定编译的jdk版本:

如果是web项目,就需要打war包,那就需要这个插件:

${project.build.sourceEncoding}强制字符集编码

platformwar包名字——platform.war

${project.build.directory}/platform

产生war前,用于存放构建war包的目录——target/platform。D�rH�4�

产生war前,用于存放构建war包的目录——target/platform。 

使用maven工具链:

使用不同的JDK的最好方法是使用工具链方式。在建立一个项目,如编译java源文件,生成Javadoc,运行单元测试、打包,这些插件中的每一个都需要一个JDK工具来对应操作:Javac、JavaDoc、JaveNeR等。使用Maven工具链插件,您可以为所有相关的Maven插件配置1个默认JDK工具链也可以各自配置不同的jdk,用法略。

配置编译插件:

除工具链方式之外,也可以在编译过程中使用的特定JDK。这样的配置对这个插件是特定的,不会影响其他插件。compilerVersion参数可以用来指定插件使用的编译器版本,但是需要将fork设置为true才能工作,此为非常用配置不做详细了解。

针对不同的编译器设置source和target选项:

有时编译某个项目时需要使用的jdk与当前maven所使用的版本不同。Javac可以使用source和target参数来接受这样的命令。编译器插件也可以被配置为在编译期间提供这些选项。如刚才上述:官网也建议指定编译的jdk版本

传递编译参数:

有时需要传递其他编译器参数,这些编译器参数本身不是插件本身需要处理的,而是需要将编译器参数传递给Javac编译器,如下图

二、POM简介

所有的 POM 都继承自一个父 POM(无论是否显式定义了这个父 POM),它包含了一些可以被继承的默认设置。Maven 使用 effective pom(Super pom 加上工程自己的配置)来执行相关,目的为了使开发者在 pom.xml中做尽可能少的配置,且在子配置中可以被方便的覆盖:

比如不指定packing时,即默认打jar包时打开effective pom:

再看另一种举例:

当指定packing为war,指定打war包时打开effective pom:

所以我们只需要指定packing打包类型,maven插件可以自动加载并继承父pom相关配置。

如果父pom中的默认配置不符合现有项目要求,而在我们的pom中有没有覆盖,则会抱错,如删除pom中的maven-compiler-plugin,使其不覆盖父pom中的maven-compiler-plugin,这样就是使用的父pom中的配置:

上图删除了pom中的maven-compiler-plugin,再看下图effecrive pom中的:

看到这样就使用了默认父pom的maven-compiler-plugin2.3.2版本,此版本默认的jdk是1.5,maven编译时报:

然后修改自己的pom中的maven-compiler-plugin覆盖父pom中的maven-compiler-plugin,使用自定义覆盖默认配置:

上图pom中增加了maven-compiler-plugin,再看下图effecrive pom中的:

则使用jdk1.7编译成功了


常用插件:

maven的属性值的占位符,类似EL,类似ant的属性,比如${X},可用于pom文件任何赋值的位置。有以下分类:

env.X:操作系统环境变量,比如${env.PATH}

project.x:pom文件中的属性,比如:1.0,引用方式:${project.version}

settings.xml文件中的属性,比如:false,引用方式:${settings.offline}

Java System Properties:java.lang.System.getProperties()中的属性,比如java.home,引用方式:${java.home}

自定义在pom文件中可以:c:/apps/cargo-installs定义属性及属性的值,而引用方式为:${installDir}


三、工作机制

   Maven强大的一个重要的原因是它有一个十分完善的生命周期模型(lifecycle),它有三套相互独立的生命周期,请注意这里说的是“三套”,请别将Maven的生命周期看成一个整体哦,三个生命周期是独立线性执行,分别是:

Clean Lifecycle 在进行真正的构建之前进行一些清理工作。

Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。

Site Lifecycle 生成项目报告,站点,发布站点。

        每个生命周期包含一些阶段(phase),这些阶段(phase)是有顺序的,每个阶段蕴含一个或多个目标(goal),并且后面的阶段依赖于前面的阶段,我们和Maven最直接的交互方式就是调用这些生命周期阶段。较之于生命周期阶段的前后依赖关系,三套生命周期本身是相互独立的,用户可以仅仅调用clean生命周期的某个阶段,或者仅仅调用default生命周期的某个阶段,而不会对其他生命周期产生任何影响。例如,当用户调用clean生命周期的clean阶段的时候,不会触发default生命周期的任何阶段。其中deault是最重要的生命周期,拥有validate 、compile 、test 、package、integration、verify、install、deploy等等阶段。

       看一下Maven的编译阶段,让maven进行编译代码,使用的是声明的方式来告知Maven如何做的。看似一个简单的命令,但其实它后面执行了一系列的工作。mvn compile如不指定compile阶段的goal,所以complie阶段所有goal,compile和test compile都会执行。

        Maven是如何知道从哪里找到要编译的源文件?并且Maven如何知道将编译好的类文件放到哪里?这里就是由Mave基础工作之一“通过配置进行约定”所解决的问题。一般情况下,源文件放在src/main/java路径下,这种默认设置(虽然在上面的POM文件中并没看到)是从父 POM继承来的,即使最简单的POM也知道源文件的默认位置:

当首次执行compile命令或其它命令时,maven会下载所有插件和相关的文件,而之后再执行同一个命令的时候会发现比第一次快很多,这就为什么首次执行命令时候会比较慢的原因。

大家有没有想过,如果maven自带的插件满足不了我们的需求时候,该怎么办呢?其实不难办,可以通过自己写插件来实现。下面给大家讲一下如何写插件。

1、首先需要创建一个maven项目tinaproject,然后把pom里的packaging改成maven-plugin

然后把版本改为你自己使用的版本,一般现在都是用maven2

接着添加依赖

2、pom修改完了之后就开始创建mojo类了,maven插件里每一个goal所对应的功能都是一个Mojo,比如说eclipse:clean和eclipse:eclipse就是两个Mojo 

写完了一个最简单的mojo类之后就来测试下能否正确运行,把mvn install吧它发布到本地maven仓库,然后在pom里再增加一个plugin(就是我自己写的这个) 

最后再运行mvn compile 就能看到输出了

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 简介 概述 Maven 是一个项目管理和整合工具 Maven 为开发者提供了一套完整的构建生命周期框架 Maven...
    闽越布衣阅读 4,261评论 6 39
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,713评论 6 342
  • 2018年2月12日下午:3:00 丨本群微课丨 亲手绘制自己内心的生命之花,彩绘曼陀罗体验微课 讲师:祝明宏老师...
    善默勤容阅读 359评论 0 0
  • 生亦何患,死亦何卒 世,事,视 不欲生,不求尽 汝,进退 环天地而立 吾,相随 绕世事而卧 不知其道,何求其意 平...
    痕殇帝阅读 277评论 0 1