maven編譯插件
A. maven install與maven build的區別是什麼
Maven build 等同於Maven命令;
mvnpackage表示對Maven工程進行打包。
Maven Clean等同於Maven命令;
mvnclean表示刪除maven工程的target目錄下的內容。
Maven Install等同於命令;
mvninstall表示將jar包發布到本地maven倉庫。
首先需要理解maven的生命周期與插件目標這兩個概念:
拿Maven clean來說吧。生命周期為clean,插件目標為maven-clean-plugin:clean。
Maven build是這個插件讓你自己去配置執行目標的。
Maven clean 清除上一次Maven執行的結果,
Maven generate-sources會根據pom配置去生成源代碼格式的包,
Maven install將項目輸出構件部署到本地倉庫。
不必太過於關注build工作的實現細節。我們只需要使用一些build生命周期短語就可以達到我們的目標,而不必管Maven是如何做到這些的。如:只需要告訴Maven要安裝(install),那麼它自然就會驗證,編譯,打包,及安裝。
B. 如何編寫一個Maven插件
基礎
當maven內置的功能不能滿足需求的時候怎麼辦,那就只能給它寫插件了。 (話說回來,給maven擴展只能寫一個很完整的插件,而不能是一個簡單的script,真的是太笨重了)
網路上很多maven的文章,但基本很少談及如何給它寫插件,即使你搜索maven plugin,也只是給你返回一堆如何使用maven插件的文章。希望這邊文章能給一些maven使用者帶來幫助。
我在這里先假設你已經懂得使用maven,我不會貼出完整的pom.xml文件
首先,你需要創建一個maven項目,插件是一種特殊的maven項目 然後修改pom.xml,將packaging改為maven-plugin
<packaging>maven-plugin</packaging>
通過properties定義maven的版本
<properties>
<maven.version>2.2.1</maven.version>
</properties>
maven3已經出了很久,並且兼容maven2,因此我們團隊內部都是統一使用maven3,但是我這里編寫插件使用的是maven2,可以同時在maven2和maven3下使用,不過其實這個原因並不重要,真正的原因是因為maven3的代碼實在太爛了,最初的時候我用maven3的api lib來寫,發現裡面很多代碼根本沒有注釋,而且很多代碼已經廢棄,但是並沒有明確說明究竟用什麼方法代替。最後我使用了maven2中被maven3廢棄的api來完成我的功能,跑的挺好的,就是有時可能會有一些使用准備廢棄的api的提醒而已。
接著添加依賴
<dependencies>
<dependency>
<groupid>org.apache.maven</groupid>
<artifactid>maven-plugin-api</artifactid>
<version>${maven.version}</version>
</dependency>
<dependency>
<groupid>org.apache.maven</groupid>
<artifactid>maven-core</artifactid>
<version>${maven.version}</version>
</dependency>
</dependencies>
然後開始創建Mojo類,maven插件裡面每一個具體的功能都是一個Mojo 比如說eclipse:clean和eclipse:eclipse就是兩個Mojo
/**
*@goalhelloWorld
*/
{
publicvoidexecute()throwsMojoExecutionException
{
getLog().info("Hello,world!");
}
}
首先繼承AbstractMojo,並且實現execute()方法,這個就是每次調用進入的地方 然後需要在類的javadoc上定義,這是一個annotation出來之前常用的定義方法(或許未來maven會將它改成annotation,那就能提供編譯校驗和IDE校驗)。我們必須定義@goal,代表運行目標,簡單來說就是eclipse:clean中的clean Mojo寫在哪個package底下都是可以的
這樣,我們就完成了一個簡單的maven plugin,然後我們需要一個簡單的測試來確定他正確運行 先通過maven install將它安裝到本地倉庫
然後打開任意maven的項目(比如說我們原來已經在用maven的項目),在pom.xml增加一個plugin
<build>
<plugins>
<plugin>
<groupid>xxx</groupid>
<artifactid>xxx</artifactid>
<version>xxx</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>helloWorld</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
需要留意的是phase部分,我們將這個plugin綁定到compile這個周期 然後我們運行mvn compile,就能成功看見Hello, world!輸出 (當然你也可以直接通過命令行運行,需要帶上完整的groupId和artifactId才能調用)
注入
Mojo是一個很簡單的Java Bean模式的類,你會發現Mojo所繼承的AbstractMojo裡面之後非常少的方法。那我們需要在Mojo.execute裡面獲取當前運行中的上下文如何處理呢?答案是注入,就是跟spring ioc差不多的注入方式。
常用的注入主要有兩種,第一種是xml配置中的額外設置 比如說我們有這么一個plugin的配置
<plugin>
<artifactid>maven-eclipse-plugin</artifactid>
<configuration>
<downloadsources>true</downloadsources>
</configuration>
</plugin>
所有寫在configuration裡面的屬性都可以注入到Mojo中,比如說以下代碼
/**
*@parameter
*/
privatebooleandownloadSources;
就可以通過downloadSources變數獲得配置中的值 值得注意的是,這里是不用生成完整的JavaBean模式的get/set的,並且private是有效的
javadoc裡面還可以加入其他屬性,比如說
/**
*@parameterdefault-value="true"
*@readonly
*/
privatebooleandownloadSources;
就是默認為true,並且不能通過配置修改(當然我們這里肯定不會有這樣的需求) 更多的javadoc可以參看官方文檔中的說明
第二種注入的數據就是上下文,跟HttpServlet.getServletContext這種寫法不一樣,如果我們需要Mojo運行期的上下文,也是通過注入獲得的
/**
*@parameterexpression="${project}"
*@readonly
*/
privateMavenProjectproject;
/**
*@component
*@readonly
*/
;
例如這里我們就能獲得ArtifactFactory和MavenProject 需要注意的是這里可能有兩種方法,第一種跟xml配置獲得的方法差不多,通過expression指定名字 實際上,你在xml裡面,也可以通過${project}獲得相應的東西進行一些簡單的操作(當然xml裡面只能文本描述,這里是一個類)
另外一種就是使用@component這個標注,可以獲得一些基本的組件實例。
測試
寫完一個插件之後,我們就需要對他進行測試 如果我們用人工測試的話,將會非常麻煩,因為maven插件本身的發布流程就非常復雜 你需要編譯打包你的maven插件,然後安裝到本地庫(或遠程私庫中),然後寫一個sample project,再運行,看一下是否正確 當然你也可以用單元測試來解決一些問題,但是單元測試比較難保證插件最終正確,而且maven插件很經常是跟文件打交道
這里我們就需要對maven插件進行自動化的集成測試 maven的生命周期是包含集成測試的,默認是沒有綁定任何功能。不過如果你google一下,會找到一些maven進行集成測試的例子,大致就是啟動jetty,然後通過http訪問驗證,再關閉jetty
我們這里使用的是maven-invoker-plugin,它就是用於maven插件的集成測試
先在pom.xml中加入
<build>
<plugins>
<plugin>
<artifactid>maven-invoker-plugin</artifactid>
<configuration>
<cloneprojectsto>${project.build.directory}/it</cloneprojectsto>
</configuration>
<executions>
<execution>
<id>integration-test</id>
<goals>
<goal>install</goal>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
cloneProjectsTo是先將測試案例拷貝出來再運行 execution段的設定是把maven-invoker-plugin的兩個goal綁定到integration-test上 integration-test這個生命周期會在mvn install之前調用
集成測試的內容放在 src/it 目錄下,每新建一個目錄代表一個獨立的測試,裡面放一個完整的maven項目,當然你在這個項目裡面需要引入自己編寫的maven插件並且運行 另外還需要一個postbuild.groovy文件,放在測試案例的根目錄,這個腳本的用處是檢查運行後的maven項目是否達到自己要的效果。很明顯,看名字就知道用groovy來寫,一般我們會檢查一下,是否產生了某某文件等等來判定,如果不正確的話拋出異常
然後我們在maven插件目錄運行mvn integration-test就能進行集成測試了
C. maven site插件怎麼用
maven是一個項目構建和管理的工具,提供了幫助管理 構建、文檔、報告、依賴、scms、發布、分發的方法。可以方便的編譯代碼、進行依賴管理、管理二進制庫等等。 maven的好處在於可以將項目過程規范化、自動化、高效化以及強大的可擴展性。
D. maven,pom.xml里配置了插件,是怎麼使用的
根據你的描述:
在pom.xml中沒有聲明的加入這個plugin時,是按照1.3來進行編譯的。你肯定不想用這么低的JDK版本把!
E. Maven組件插件無法執行問題,怎麼解決
剛好我也碰到這樣的問題,給你如下解決方案參考下:1、解決IE下flash插件背景顏色為白色的問題,不透明的問題;解決方法:可以給你的flash插件做一個跟網頁背景顏色一樣顏色的背景圖片,然後把它作為flash插件的背景。2、解決IE下flash插件經常出現不能上傳的問題;解決方法:給你的js中引入flash插件的網址後面加一個隨機數,每次載入頁面請求的這個flash文件的地址都不一樣,這樣來確保flash能被IE瀏覽器正常地播放和執行。
F. apache maven插件是怎麼打jar包的
Java框架jar包是經過包裝處理的,如果是java提供的文件,是不可以編輯的。替換文件之後,很有可能會編譯不通過,建議不要替換,
G. 怎樣在myeclipse2014中配置maven插件
1
創建maven工程,新建project,右鍵選擇New Project,勾選快速創建選項,這個選項可以快速創建簡單的maven工程。
多圖
2
項目創建成功後,項目目錄主要有:主代碼目錄、主資源目錄、測試代碼目錄、測試資源目錄、輸出目錄(代碼編譯存放的目錄)。
3
添加項目依賴,查找項目依賴通常有兩種方式:1. 直接在eclipse上查找,2. 在私服nexus上查找再復制依賴信息到pom.xml中。在eclipse中查找右鍵項目或pom.xml,輸入關鍵信息查找,選中要引入的構件,點OK就可以自動引入。
多圖
4
在nexus中查找依賴,打開nexus輸入關鍵信息點擊查找按鈕,在搜索結果中找到對應的jar包,復制右下角的那段信息到pom.xml的dependencies下,如圖所示。
多圖
5
在MyEclipse上運行mvn命令,右鍵項目選擇Run As--》Maven clean。mvn命令有很多,簡單說明下比較常用的命令:
1. clean 用於清理輸出目錄target/
2. compile用於編譯項目主代碼
3. test 用於編譯運行測試代碼
4. package 接受編譯好的代碼,打包成可發布的模式
5. install 將包安裝到maven本地倉庫
6. Deploy將最終的包復制到遠程倉庫
執行以上命令時,clean是不會自動執行的,因為clean和其他5個命令是不同的生命周期,因此需要使用組合命令。
6
在MyEclipse中運行組合命令,右鍵項目選擇Run As--》Maven build...
7
前面介紹了怎麼運行一些命令,現在講下怎麼樣運行實例。在主代碼目錄和測試目錄上添加代碼。
多圖
8
運行命令clean install,運行結果如圖所示,從結果可以看到,命令運行成功,運行了一次測試並且運行通過,同時,將jar打包到項目的target目錄下,也安裝到maven的的本地倉庫上了。
多圖
9
將jar包部署到私服nexus上,在pom.xml中添加一些配置,最後發布運行命令
clean deploy,發布後可以到私服nexus查找有沒有剛剛部署的jar包
H. 如何用exec-maven-plugin插件執行jar包
solution:參數需要另外配置 link
<executable>java</executable>
<arguments>
<argument>-jar</argument>
<argument>target\XXX.jar</argument>
</arguments>
綁定在generate-sources上是為編譯時提前自動生成代碼
I. maven中插件plugin和依賴dependency的區別
插件是一種工具,例如compile插件是用來編譯代碼的工具,mybatis插件是用來自動生成資料庫和mapper的工具。而依賴則是項目工程在編譯過程中需要依賴的二方及三方包。在你的工程中可以不需要mybatis插件,自己去實現sql的crud,但如果工程里需要三房包,則必須要用dependency引入。