做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提供的打包工具,畢竟,程序員的世界,命令行纔是最高效的工具,大家加油。