日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Maven提高篇系列之六

 feimishiwo 2014-12-30

本系列上一篇文章中,我們講到了如何處理依賴沖突,在本文中,我們將講到如何編寫自己的Plugin。

 

Maven就其本身來說只是提供一個(gè)執(zhí)行環(huán)境,它并不知道需要在項(xiàng)目上完成什么操作,真正操作項(xiàng)目的是插件(plugin),比如編譯Java有Compiler插件,打包有Jar插件等。所以要讓Maven完成各種各樣的任務(wù),我們需要配置不同的插件,甚至自己編寫插件。

 

你可能要問了:“我并沒有配置什么插件啊,照樣能編譯打包?!边@是因?yàn)镸aven在默認(rèn)情況下已經(jīng)給我們配置了一些常用的插件,上面的Compiler和Jar便在這些插件之列。要查看Maven的默認(rèn)插件,我們需要找到Super Pom,在筆者的電腦上,Super Pom位于M2_HOME/lib/maven-2.2.1-uber.jar文件中,文件名為pom-4.0.0.xml,里面包含了Maven所有的默認(rèn)插件:

 

<pluginManagement>
     
       <plugins>
     
         <plugin>
     
           <artifactId>maven-antrun-plugin</artifactId>
     
           <version>1.3</version>
     
         </plugin>       
     
         <plugin>
     
           <artifactId>maven-assembly-plugin</artifactId>
     
           <version>2.2-beta-2</version>
     
         </plugin>         
     
         <plugin>
     
           <artifactId>maven-clean-plugin</artifactId>
     
           <version>2.2</version>
     
         </plugin>
     
         <plugin>
     
           <artifactId>maven-compiler-plugin</artifactId>
     
           <version>2.0.2</version>
     
         </plugin>
     
          ......
     
       </plugins>
     
</pluginManagement>

 

 

任何Maven工程默認(rèn)都繼承自這個(gè)Super Pom,你也可以在自己的項(xiàng)目中執(zhí)行:        

 

mvn help:effective-pom

 

來查看包括繼承內(nèi)容的整個(gè)pom文件,其中便包含了從Super Pom繼承下來的內(nèi)容。

 

和其他Maven項(xiàng)目一樣,Maven的插件也是一種packaging類型(類型為maven-plugin),也擁有g(shù)roupId,artifactId和version。簡(jiǎn)單地講,一個(gè)Maven插件包含了一些列的goal,每一個(gè)goal對(duì)應(yīng)于一個(gè)Mojo類(Maven Old Java Object,命名來自于Pojo),每個(gè)Mojo都需要實(shí)現(xiàn)org.apache.maven.plugin.Mojo接口,該接口定義了一個(gè)execute方法,在開發(fā)插件時(shí),你的任務(wù)就是實(shí)現(xiàn)這個(gè)execute方法。

 

(一)創(chuàng)建自己的插件

接下來,我們來實(shí)現(xiàn)一個(gè)Maven插件,該插件輸出項(xiàng)目的build目錄信息。請(qǐng)下載本文的github源代碼:https://github.com/davenkin/demo-maven-plugin

 

先通過archetype創(chuàng)建一個(gè)Maven插件工程:

 

 mvn archetype:generate       -DgroupId=me.davenkin       -DartifactId=demo-maven-plugin       -DarchetypeGroupId=org.apache.maven.archetypes       -DarchetypeArtifactId=maven-archetype-mojo

 

此時(shí)打開工程中的pom.xml文件,你可以看到該工程的packaging類型:

 

<packaging>maven-plugin</packaging>

 

向工程中添加一個(gè)Mojo類:

 

package me.davenkin;

import org.apache.maven.model.Build;

import org.apache.maven.plugin.AbstractMojo;

import org.apache.maven.plugin.MojoExecutionException;

import org.apache.maven.project.MavenProject;

 

/**

* @goal buildinfo

* @phase  pre-integration-test

*/

public class BuildInfoMojo extends AbstractMojo {

 

   /**

    * @parameter expression="${project}"

    * @readonly

    */

   private MavenProject project;

 

   /**

    * @parameter expression="${buildinfo.prefix}"

    * default-value="+++"

    */

   private String prefix;

 

   public void execute() throws MojoExecutionException {

       Build build = project.getBuild();

       String outputDirectory = build.getOutputDirectory();

       String sourceDirectory = build.getSourceDirectory();

       String testOutputDirectory = build.getTestOutputDirectory();

       String testSourceDirectory = build.getTestSourceDirectory();

       getLog().info("\n==========================\nProject build info:");

       String[] info = {outputDirectory, sourceDirectory, testOutputDirectory, testSourceDirectory};

       for (String item : info) {

           getLog().info("\t" + prefix + "   " + item);

       }

       getLog().info("=======================");

   }

}

 

在上面的代碼中,“@goal buildinfo”表示該Mojo對(duì)應(yīng)的goal的名字為buildinfo(在調(diào)用該goal時(shí)需要給出它的名字),“@phase   pre-integration-test”表示該Mojo默認(rèn)被綁定在了pre-integration-test階段。之后的:

 

   /**

    * @parameter expression="${project}"

    * @readonly

    */

   private MavenProject project;

 

表示該插件持有一個(gè)到MavenProject的引用,當(dāng)客戶方在執(zhí)行該插件時(shí),這里的project字段便表示客戶工程。這里我們并沒有對(duì)project進(jìn)行初始化,但是“@parameter expression="${project}"”中的${project}即表示當(dāng)前的客戶工程,Maven在運(yùn)行時(shí)會(huì)通過依賴注入自動(dòng)將客戶工程對(duì)象賦給project字段(請(qǐng)參考Maven自己的IoC容器Plexus)。此外,我們還聲明了一個(gè)prefix字段,該字段表示對(duì)輸出的各行加上prefix前綴字符串,默認(rèn)為“+++”(加入prefix字段主要用于演示對(duì)插件參數(shù)的配置,這里的project和prefix都表示插件參數(shù),我們可以在客戶方重新配置這些參數(shù))。

 

由于上面的代碼用到了MavenProject類,我們還需要在該插件工程的pom.xml中加入以下依賴:

 

       <dependency>

           <groupId>org.apache.maven</groupId>

           <artifactId>maven-project</artifactId>

           <version>2.2.1</version>

       </dependency>

 

在執(zhí)行了“mvn clean install“之后,我們便可以通過一下命令調(diào)用該Mojo:

 

       mvn me.davenkin:demo-maven-plugin:1.0-SNAPSHOT:buildinfo

 

筆者在當(dāng)前的插件工程中執(zhí)行該命令輸出結(jié)果如下:

......

==========================

Project build info:

[INFO] +++   /home/davenkin/Desktop/demo-maven-plugin/demo-maven-pugin/target/classes

[INFO] +++   /home/davenkin/Desktop/demo-maven-plugin/demo-maven-pugin/src/main/java

[INFO] +++   /home/davenkin/Desktop/demo-maven-plugin/demo-maven-pugin/target/test-classes

[INFO] +++   /home/davenkin/Desktop/demo-maven-plugin/demo-maven-pugin/src/test/java

[INFO] =======================

......

 

以上的”+++“便表示prefix的默認(rèn)屬性值,后跟各個(gè)build目錄。我們也可以通過"-D"參數(shù)為prefix重新賦值:

 

       mvn me.davenkin:demo-maven-plugin:1.0-SNAPSHOT:buildinfo -Dbuildinfo.prefix=---

 

以上我們用"---"代替了默認(rèn)的"+++"。

 

你可能注意到,為了調(diào)用該插件的buildinfo這個(gè)goal,我們需要給出該插件的所有坐標(biāo)信息,包括groupId,artifactId和version號(hào)。你可能之前已經(jīng)執(zhí)行過"mvn eclipase:eclipase"或"mvn idea:idea"這樣簡(jiǎn)潔的命令,讓我們也來將自己的插件調(diào)用變簡(jiǎn)單一點(diǎn)。

 

要通過簡(jiǎn)單別名的方式調(diào)用Maven插件,我們需要做到以下兩點(diǎn):

 

  1. 插件的artifactId應(yīng)該遵循***-maven-plugin或maven-***-plugin命名規(guī)則,對(duì)于本文中的插件,我們已經(jīng)遵循了。(當(dāng)然不遵循也是可以的,此時(shí)你需要使用Maven Plugin Plugin來設(shè)置goalPrefix,此時(shí)就不見得為“demo”了)

  2. 需要將插件的groupId放在Maven默認(rèn)的插件搜尋范圍之內(nèi),默認(rèn)情況下Maven只會(huì)在org.apache.maven.plugins和org.codehaus.mojo兩個(gè)groupId下搜索插件,要讓Maven同時(shí)搜索我們自己的groupId,我們需要在~/.m2/settings.xml中加入:

    <pluginGroups>

           <pluginGroup>me.davenkin</pluginGroup>

       </pluginGroups>

     

 

在達(dá)到以上兩點(diǎn)之后,我們便可以通過以下命令來調(diào)用自己的插件了:

 

       mvn demo:buildinfo

 

 

(二)在別的項(xiàng)目使用插件

要在別的項(xiàng)目中應(yīng)用插件也是簡(jiǎn)單的,我們只需要在該項(xiàng)目的pom.xml文件中聲明該插件的即可:

 

          <plugin>

               <groupId>me.davenkin</groupId>

               <artifactId>demo-maven-plugin</artifactId>

               <version>1.0-SNAPSHOT</version>

               <configuration>

                   <prefix>---</prefix>

               </configuration>

 

               <executions>

                   <execution>

                       <id>buildinfo</id>

                       <phase>process-sources</phase>

                       <goals>

                           <goal>buildinfo</goal>

                       </goals>

                   </execution>

               </executions>

           </plugin>

 

在上面的配置中,我們將demo-maven-plugin插件的buildinfo綁定在了process-sources階段,并將prefix參數(shù)該為了"---",這樣在執(zhí)行"mvn clean install" 時(shí),該插件的輸出內(nèi)容將顯示在終端。另外,我們可以通過設(shè)置屬性的方式為demo-maven-plugin的prefix參數(shù)賦值,在pom.xml中加入一下property:

 

   <properties>

       <buildinfo.prefix>---</buildinfo.prefix>

   </properties>

 

此時(shí),去掉plugin配置中的:

 

               <configuration>

                   <prefix>---</prefix>

               </configuration>

 

運(yùn)行"mvn clean install",輸出效果和之前一樣。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多