原創(chuàng)者:文思org.apache.maven.plugins系列插件簡(jiǎn)介一、插件知識(shí)簡(jiǎn)介 簡(jiǎn)介: compiler插件3.0之前,默認(rèn)的Java編譯器就的JDK自帶的javac。但是從Compiler插件3.0開始(需要JDK1.6),默認(rèn)的Java編譯器 是javax.tools.JavaCompiler。如果仍然希望使用JDK自帶的javac編譯源代碼,就需要為mvn命令配置forceJavacCompilerUse啟動(dòng)參數(shù)如:-Dmaven.compiler.forceJavacCompilerUse=true Compiler插件編譯時(shí)和編譯后運(yùn)行的JVM版本目前默認(rèn)的設(shè)置為1.5,默認(rèn)用此版本,而不是根據(jù)你項(xiàng)目中指定的jdk版本編譯。如果你想改變這些默認(rèn)設(shè)置,你應(yīng)該設(shè)置編譯源和目標(biāo)中java編譯器的目標(biāo),通過設(shè)置Java源代碼兼容的JVM版本,標(biāo)明Java源代碼開發(fā)過程中使用的Java版本,通過設(shè)置編譯后的類庫擬運(yùn)行的JVM版本,給出編譯后的類庫將要運(yùn)行的Java環(huán)境(一般都會(huì)設(shè)置,因?yàn)楹苌儆许?xiàng)目再用1.7以下的版本了): 同時(shí),命令mvn的運(yùn)行需要依賴JDK,Compiler插件默認(rèn)使用當(dāng)前運(yùn)行mvn命令的JDK去編譯Java源代碼。如果想使用其他版本的JDK(比如本地java環(huán)境的,而非maven自帶的)編譯Java源代碼,則需要設(shè)置如下(重點(diǎn)fork 、executable、compilerVersion): 上述配置中,用以編譯Java源代碼的是JDK 1.8,運(yùn)行mvn命令時(shí)指定maven所使用的是JDK為1.6 Compiler插件提供了如下2個(gè)goal,默認(rèn)都已經(jīng)綁定到Maven的生命周期階段,無需單獨(dú)指出。 compiler:compile,綁定到compile 階段,用以編譯main/路徑下的源代碼 compiler:testCompile,綁定到test-compile階段,用以編譯test/路徑下的源代碼 mvn compile: 下圖看出官網(wǎng)也建議指定編譯的jdk版本:如果是web項(xiàng)目,就需要打war包,那就需要這個(gè)插件: ${project.build.sourceEncoding}強(qiáng)制字符集編碼 platformwar包名字——platform.war ${project.build.directory}/platform 產(chǎn)生war前,用于存放構(gòu)建war包的目錄——target/platform。D?rH?4? 產(chǎn)生war前,用于存放構(gòu)建war包的目錄——target/platform。 使用maven工具鏈: 使用不同的JDK的最好方法是使用工具鏈方式。在建立一個(gè)項(xiàng)目,如編譯java源文件,生成Javadoc,運(yùn)行單元測(cè)試、打包,這些插件中的每一個(gè)都需要一個(gè)JDK工具來對(duì)應(yīng)操作:Javac、JavaDoc、JaveNeR等。使用Maven工具鏈插件,您可以為所有相關(guān)的Maven插件配置1個(gè)默認(rèn)JDK工具鏈也可以各自配置不同的jdk,用法略。 配置編譯插件: 除工具鏈方式之外,也可以在編譯過程中使用的特定JDK。這樣的配置對(duì)這個(gè)插件是特定的,不會(huì)影響其他插件。compilerVersion參數(shù)可以用來指定插件使用的編譯器版本,但是需要將fork設(shè)置為true才能工作,此為非常用配置不做詳細(xì)了解。 針對(duì)不同的編譯器設(shè)置source和target選項(xiàng): 有時(shí)編譯某個(gè)項(xiàng)目時(shí)需要使用的jdk與當(dāng)前maven所使用的版本不同。Javac可以使用source和target參數(shù)來接受這樣的命令。編譯器插件也可以被配置為在編譯期間提供這些選項(xiàng)。如剛才上述:官網(wǎng)也建議指定編譯的jdk版本 傳遞編譯參數(shù): 有時(shí)需要傳遞其他編譯器參數(shù),這些編譯器參數(shù)本身不是插件本身需要處理的,而是需要將編譯器參數(shù)傳遞給Javac編譯器,如下圖 二、POM簡(jiǎn)介 所有的 POM 都繼承自一個(gè)父 POM(無論是否顯式定義了這個(gè)父 POM),它包含了一些可以被繼承的默認(rèn)設(shè)置。Maven 使用 effective pom(Super pom 加上工程自己的配置)來執(zhí)行相關(guān),目的為了使開發(fā)者在 pom.xml中做盡可能少的配置,且在子配置中可以被方便的覆蓋: 比如不指定packing時(shí),即默認(rèn)打jar包時(shí)打開effective pom: 再看另一種舉例: ![]() 當(dāng)指定packing為war,指定打war包時(shí)打開effective pom: ![]() 所以我們只需要指定packing打包類型,maven插件可以自動(dòng)加載并繼承父pom相關(guān)配置。 如果父pom中的默認(rèn)配置不符合現(xiàn)有項(xiàng)目要求,而在我們的pom中有沒有覆蓋,則會(huì)抱錯(cuò),如刪除pom中的maven-compiler-plugin,使其不覆蓋父pom中的maven-compiler-plugin,這樣就是使用的父pom中的配置: ![]() 上圖刪除了pom中的maven-compiler-plugin,再看下圖effecrive pom中的: ![]() 看到這樣就使用了默認(rèn)父pom的maven-compiler-plugin2.3.2版本,此版本默認(rèn)的jdk是1.5,maven編譯時(shí)報(bào): ![]() 然后修改自己的pom中的maven-compiler-plugin覆蓋父pom中的maven-compiler-plugin,使用自定義覆蓋默認(rèn)配置: ![]() 上圖pom中增加了maven-compiler-plugin,再看下圖effecrive pom中的: ![]() ![]() 則使用jdk1.7編譯成功了 常用插件: ![]() maven的屬性值的占位符,類似EL,類似ant的屬性,比如${X},可用于pom文件任何賦值的位置。有以下分類: env.X:操作系統(tǒng)環(huán)境變量,比如${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} 三、工作機(jī)制 Maven強(qiáng)大的一個(gè)重要的原因是它有一個(gè)十分完善的生命周期模型(lifecycle),它有三套相互獨(dú)立的生命周期,請(qǐng)注意這里說的是“三套”,請(qǐng)別將Maven的生命周期看成一個(gè)整體哦,三個(gè)生命周期是獨(dú)立線性執(zhí)行,分別是: Clean Lifecycle 在進(jìn)行真正的構(gòu)建之前進(jìn)行一些清理工作。 Default Lifecycle 構(gòu)建的核心部分,編譯,測(cè)試,打包,部署等等。 Site Lifecycle 生成項(xiàng)目報(bào)告,站點(diǎn),發(fā)布站點(diǎn)。 每個(gè)生命周期包含一些階段(phase),這些階段(phase)是有順序的,每個(gè)階段蘊(yùn)含一個(gè)或多個(gè)目標(biāo)(goal),并且后面的階段依賴于前面的階段,我們和Maven最直接的交互方式就是調(diào)用這些生命周期階段。較之于生命周期階段的前后依賴關(guān)系,三套生命周期本身是相互獨(dú)立的,用戶可以僅僅調(diào)用clean生命周期的某個(gè)階段,或者僅僅調(diào)用default生命周期的某個(gè)階段,而不會(huì)對(duì)其他生命周期產(chǎn)生任何影響。例如,當(dāng)用戶調(diào)用clean生命周期的clean階段的時(shí)候,不會(huì)觸發(fā)default生命周期的任何階段。其中deault是最重要的生命周期,擁有validate 、compile 、test 、package、integration、verify、install、deploy等等階段。 看一下Maven的編譯階段,讓maven進(jìn)行編譯代碼,使用的是聲明的方式來告知Maven如何做的??此埔粋€(gè)簡(jiǎn)單的命令,但其實(shí)它后面執(zhí)行了一系列的工作。mvn compile如不指定compile階段的goal,所以complie階段所有g(shù)oal,compile和test compile都會(huì)執(zhí)行。 Maven是如何知道從哪里找到要編譯的源文件?并且Maven如何知道將編譯好的類文件放到哪里?這里就是由Mave基礎(chǔ)工作之一“通過配置進(jìn)行約定”所解決的問題。一般情況下,源文件放在src/main/java路徑下,這種默認(rèn)設(shè)置(雖然在上面的POM文件中并沒看到)是從父 POM繼承來的,即使最簡(jiǎn)單的POM也知道源文件的默認(rèn)位置: ![]() 當(dāng)首次執(zhí)行compile命令或其它命令時(shí),maven會(huì)下載所有插件和相關(guān)的文件,而之后再執(zhí)行同一個(gè)命令的時(shí)候會(huì)發(fā)現(xiàn)比第一次快很多,這就為什么首次執(zhí)行命令時(shí)候會(huì)比較慢的原因。 大家有沒有想過,如果maven自帶的插件滿足不了我們的需求時(shí)候,該怎么辦呢?其實(shí)不難辦,可以通過自己寫插件來實(shí)現(xiàn)。下面給大家講一下如何寫插件。 1、首先需要?jiǎng)?chuàng)建一個(gè)maven項(xiàng)目tinaproject,然后把pom里的packaging改成maven-plugin ![]() 然后把版本改為你自己使用的版本,一般現(xiàn)在都是用maven2 ![]() 接著添加依賴 ![]() 2、pom修改完了之后就開始創(chuàng)建mojo類了,maven插件里每一個(gè)goal所對(duì)應(yīng)的功能都是一個(gè)Mojo,比如說eclipse:clean和eclipse:eclipse就是兩個(gè)Mojo ![]() 寫完了一個(gè)最簡(jiǎn)單的mojo類之后就來測(cè)試下能否正確運(yùn)行,把mvn install吧它發(fā)布到本地maven倉庫,然后在pom里再增加一個(gè)plugin(就是我自己寫的這個(gè)) ![]() 最后再運(yùn)行mvn compile 就能看到輸出了 ![]() |
|