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