Maven編譯系列(一)——Plugin

做java開發的肯定對maven再熟悉不過了,可是我之前對maven的瞭解卻也僅限於拷貝pom模版,然後添加自己的dependecy而已,頂多加上build和repository這兩個參數來指定java版本和maven源,最後編譯這塊兒還是靠IDEA的編譯功能來打jar包,對於怎麼用maven編譯這塊兒實在不瞭解,碰到有些需要maven編譯的項目就無從下手,這才痛下決心找個時間徹底研究一下maven。先從開源項目中佔比最大的plugin這部分學起吧。

要想知道plugin的用法,還是得首先了解maven的生命週期,maven的生命週期如上圖所示,看起來是maven幫我們實現了打包等邏輯,但事實上,maven自身的核心並不執行任何具體的構建任務,所有這些任務都交給插件來完成。所以Maven本質上是一個插件框架。每個生命週期包含了多個步驟(phase),而 goal 則是綁定到 phase 上的,每一個 phase 都對應 1 個或多個 goal。

這裏注意一點就是在一個生命週期中,運行某個階段的時候,它之前的所有階段都會被運行。

下面我們以開源項目maxwell的pom(https://github.com/zendesk/maxwell/blob/master/pom.xml)文件中的plugin入手,學習一下常用的plugin的用法把

   <plugins>
      <!-- horrible sonatype plugins -->
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
        <!--是一個nexus用來自動控制流程的客戶端插件。如果你想分享自己的java開源項目到maven中央倉庫,就有可能需要這個插件。-->
        <version>1.6.6</version>
        <extensions>true</extensions>
        <configuration>
          <serverId>ossrh</serverId>
          <nexusUrl>https://oss.sonatype.org/</nexusUrl>
          <autoReleaseAfterClose>true</autoReleaseAfterClose>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-gpg-plugin</artifactId>
        <!--maven-gpg-plugin是對maven構件進行簽名的插件,使用的是GnuPG-->
        <version>1.5</version>
        <executions>
          <execution>
            <id>sign-artifacts</id>
            <phase>verify</phase>
            <goals>
              <goal>sign</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <!--該插件的作用是將源碼也單獨打成一個jar包,默認情況下,這個jar包會在target目錄生成。-->
        <version>3.0.1</version>
        <executions>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar-no-fork</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <!-- 將main中的代碼打包到jar 包中,因爲它不會fork build,所以適合放在build 這個階段,默認是綁在 package階段-->
        <version>2.9.1</version>
        <configuration>
            <source>8</source>
        </configuration>
        <executions>
          <execution>
            <id>attach-javadocs</id>
            <goals>
              <!--用標準javadoc Tool將非聚合項目的main代碼打包到一個jar包裏-->
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <!--編譯代碼的插件,默認使用的是javax.tools.JavaCompiler,想強制該插件使用javac,可以通過配置forceJavacCompilerUse這個配置-->
        <version>3.6.2</version>
        <configuration>
          <!--配置jdk版本-->
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.antlr</groupId>
        <artifactId>antlr4-maven-plugin</artifactId>
        <!--Antlr 是一個基於 Java 開發的功能強大的語言識別工具,這個插件的作用是告訴標準ANTLR解析器生成器輸入語法文件在哪裏,默認是src/main/antlr4,輸出文件應該在哪裏生成,默認是target/generated-sources/antlr4-->
        <version>4.5</version>
        <executions>
          <execution>
            <id>antlr</id>
            <goals>
              <goal>antlr4</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <!--很實用的工具,用來指導maven怎麼生成打包後的release包結構,我們看到的開源項目裏的release包裏有bin,有lib,有conf目錄,都是這個插件的功能-->
        <version>3.1.0</version>
        <configuration>
          <!--將assembly id 從最終的assembly名中排除>
          <appendAssemblyId>false</appendAssemblyId>
          <!--設置遇到文件名過長(超過100字符)的時候,打包工具的行爲,支持warn(默認),fail,truncate,gnu,posix,posix_warn,omit-->
          <tarLongFileMode>posix</tarLongFileMode>
          <descriptors>
            <!--指定release包生成方式的配置xml位置-->
            <!--formats,打包格式,支持dir,zip,tar,tar.gz等等-->
            <!--fileSets 要包含的文件夾,裏面可以配置include-->
            <!--files 要打包的單個文件>
            <descriptor>src/main/assembly/assembly.xml</descriptor>
          </descriptors>
        </configuration>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <!--爲項目生成一個jar包,包含資源文件-->
        <version>3.0.2</version>
        <configuration>
          <!--archive配置,參考http://maven.apache.org/shared/maven-archiver/index.html#class_manifest-->
          <archive>
            <manifest>
              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
              <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
            </manifest>
          </archive>
        </configuration>
      </plugin>

      <plugin>
        <artifactId>maven-dependency-plugin</artifactId>
        <!--依賴管理方式,可以將依賴打包從local或者remote拷貝到指定位置-->
        <executions>
          <execution>
            <phase>compile</phase>
            <goals>
              <!--將依賴拷貝到指定位置-->
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <!--輸出目錄-->
              <outputDirectory>${project.build.directory}/lib</outputDirectory>
              <!--要排除的Artifact-->
              <excludeArtifactIds>kafka-clients</excludeArtifactIds>
              <includeScope>runtime</includeScope>
            </configuration>
          </execution>
          <execution>
            <id>kafka-clients</id>
            <phase>compile</phase>
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
              <outputDirectory>${project.build.directory}/lib/kafka-clients</outputDirectory>
              <includeArtifactIds>kafka-clients</includeArtifactIds>
            </configuration>
          </execution>
        </executions>
      </plugin>

授人以魚不如授人以漁,學習maven插件的最好的辦法還是去官網看,http://maven.apache.org/plugins/index.html,這個地方有所有官方的插件列表,需要查詢什麼的時候,點進插件詳情頁,再點擊Goals,就可以看到每一個Goal的功能介紹,配置,還又實例。最後還是要多多實踐,不能一直只依賴idea或者eclipse提供的打包工具,畢竟,程序員的世界,命令行纔是最高效的工具,大家加油。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章