maven編譯程式碼詳細介紹
第一、main目錄下的主程式碼編寫完畢後,使用Maven進行編譯,在專案根目錄下執行命令mvn clean compile進
行專案編譯。
第二、test目錄下的測試用例編寫完畢之後就可以呼叫Maven執行測試,執行mvn clean test進行測試。
第三、將專案進行編譯、測試之後,下一個重要步驟就是打包(package)。在pom.xml中定義
<packaging>war</packaging>標籤表示將要把工程打成什麼型別的包(預設是jar型別),我們可以簡單地
執行命令mvn clean package進行打包。
第四、war外掛的war目標將專案主程式碼打包成一個名為<artifactId>S3h3WebWs</artifactId>標籤中的定義-
<version>0.0.1-SNAPSHOT</version>標籤中的定義.war的檔案
(最終的jar檔案是S3h3WebWs-0.0.1-SNAPSHOT.war),該檔案也位於target/輸出目錄中,它是根據
artifact-version.jar規則進行命名的,如有需要,我們還可以使用finalName來自定義該檔案的名稱。
第五、至此,我們得到了專案的輸出,如果我們把專案打成了jar檔案並且需要在其他專案中使用的話,就可以
複製這個jar檔案到其他專案的Classpath中從而使用這個專案中的類。但是,如何才能讓其他的Maven項
目直接引用這個jar呢?我們還需要一個安裝的步驟,執行mvn clean install命令。
第六、我們已經將體驗了Maven最主要的命令:mvn clean compile、mvn clean test、
mvn clean package、mvn clean install。執行test之前是會先執行compile的,執行package之前是
會先執行test的,而類似地,install之前會執行package。
第七、如果專案中有一個擁有main方法的類需要被呼叫執行。預設打包生成的jar是不能夠直接執行的main方法
的,因為帶有main方法的類資訊不會新增到manifest中(我們可以開啟jar檔案中的META-INF/MANIFEST.MF
檔案,將無法看到Main-Class一行)。為了生成可執行的jar檔案,我們需要藉助maven-shade-plugin插
件,配置該外掛如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.todaytech.framework.utils.VoConvertXmlUtils</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
plugin元素在POM中的相對位置應該在<project><build><plugins>下面。我們配置了mainClass
為com.todaytech.framework.utils.VoConvertXmlUtils ,專案在打包時會將該資訊放到MANIFEST中。現
在執行 mvn clean install,待構建完成之後開啟target/目錄,我們可以看到
S3h3WebWs-0.0.1-SNAPSHOT.jar和original-S3h3WebWs-0.0.1-SNAPSHOT.jar,前者是帶有Main-Class資訊
的可執行jar,後者是原始的jar,開啟hello-world-1.0-SNAPSHOT.jar的META-INF/MANIFEST.MF,可以看 到它包含這樣一行資訊:Main-Class: com.todaytech.framework.utils.VoConvertXmlUtils
現在,我們在專案根目錄中執行該jar檔案:
D: \code\S3h3WebWs>java -jar target\S3h3WebWs-0.0.1-SNAPSHOT.jar
Hello Maven
控制檯輸出為Hello Maven,這正是我們所期望的。
第八、使用maven archetype來建立該專案的骨架,離開當前的Maven專案目錄。
如果是Maven 3,簡單的執行:
mvn archetype:generate
如果是Maven 2,最好執行如下命令:
mvn org.apache.maven.plugins:maven-archetype-plugin:2.0-alpha-5:generate
很多資料會讓你直接使用更為簡單的 mvn archetype:generate 命令,但在Maven2中這是不安全的,因為
該命令沒有指定archetype外掛的版本,於是Maven會自動去下載最新的版本,進而可能得到不穩定的
SNAPSHOT版本,導致執行失敗。然而在Maven 3中,即使使用者沒有指定版本,Maven也只會解析最新的穩定
版本,因此這是安全的。
我們實際上是在執行外掛maven-archetype-plugin,注意冒號的分隔,其格式為
groupId:artifactId:version:goal,org.apache.maven.plugins是maven官方外掛的groupId,
maven-archetype-plugin是archetype外掛的artifactId,2.0-alpha-5是目前該外掛最新的穩定版,
generate是我們要使用的外掛目標。
緊接著我們會看到一段長長的輸出,有很多可用的archetype供我們選擇,包括著名的Appfuse專案的
archetype,JPA專案的archetype等等。每一個archetype前面都會對應有一個編號,同時命令列會提示一
個預設的編號,其對應的archetype為maven-archetype-quickstart,我們直接回車以選擇該archetype,
緊接著Maven會提示我們輸入要建立專案的groupId、artifactId、 version、以及包名package。
--------------------------------------------------------------------------------------------------
生成清除Eclipse專案結構:
mvn eclipse:eclipse
mvn eclipse:clean
清理(刪除target目錄下編譯內容):
mvn clean
僅打包Web頁面檔案:
mvn war:exploded
打包時跳過測試:
mvn package -Dmaven.test.skip=ture
跳過測試執行maven任務:
mvn -Dmaven.test.skip=true XXX
建立Maven的普通java專案(只適用於Maven2.x版本):
mvn archetype:create -DgroupId=packageName -DartifactId=projectName
建立Maven的Web專案(只適用於Maven2.x版本):
mvn archetype:create -DgroupId=packageName -DartifactId=webappName DarchetypeArtifactId=maven-archetype-webapp
建立Maven的Web專案(只適用於Maven3.x版本):
C:\Documents and Settings\Administrator>f:
F:\>cd F:\SoftWare\Maven\MavenWebAppTest
F:\SoftWare\Maven\MavenWebAppTest>mvn archetype:generate -DgroupId=com.shihuan -DartifactId=S3h3WebWs -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
建立Maven的Quickstart專案(只適用於Maven3.x版本):
C:\Documents and Settings\Administrator>f:
F:\>cd F:\SoftWare\Maven\MavenWebAppTest
F:\SoftWare\Maven\MavenWebAppTest>mvn archetype:generate -DgroupId=com.shihuan -DartifactId=S3h3WebWs -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
檢視詳細日誌資訊命令:
mvn archetype:create -Dgroupid=com.shihuan -Dartifactid=S3h3WebWs -e -DarchetypeArtifactid=maven-archetype-webapp
或者
mvn archetype:create -Dgroupid=com.shihuan -Dartifactid=S3h3WebWs -X -DarchetypeArtifactid=maven-archetype-webapp
編譯原始碼: mvn compile
編譯測試程式碼:mvn test-compile
執行測試:mvn test
生成站點目錄: mvn site
生成站點目錄併發布:mvn site-deploy
安裝當前工程的輸出檔案到本地倉庫: mvn install
安裝指定檔案到本地倉庫:mvn install:install-file -DgroupId=<groupId> -DartifactId=<artifactId> -Dversion=1.0.0 -Dpackaging=jar -Dfile=<myfile.jar>
檢視實際pom資訊: mvn help:effective-pom
分析專案的依賴資訊:mvn dependency:analyze 或 mvn dependency:tree
檢視幫助資訊:mvn help:help 或 mvn help:help -Ddetail=true
檢視外掛的幫助資訊:mvn <plug-in>:help,比如:mvn dependency:help 或 mvn ant:help
生成eclipse專案:mvn eclipse:eclipse
生成idea專案:mvn idea:idea
組合使用goal命令,如只打包不測試:mvn -Dtest package
只打jar包: mvn jar:jar
只測試而不編譯,也不測試編譯:mvn test -skipping compile -skipping test-compile
在pom.xml檔案中增加servlet容器的外掛:
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.6</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<
</build>
啟動tomcat:
mvn tomcat:run
啟動jetty:
mvn jetty:run
轉化為eclipse專案:
mvn -Dwtpversion=1.5 eclipse:eclipse
這樣生成wtp外掛的web專案。
開啟eclipse,選單選擇:file>import>general>existing projects into workspace,在對話方塊中選中目錄,匯入即可。
另外,需要在eclipse裡建立一個classpath變數,名稱為:M2_REPO,值為系統使用者下.m2/repository目錄。
packaging : 打包的格式可以為:pom , jar , maven-plugin , ejb , war , ear , rar , par
POM間關係: 依賴關係(dependencies)、繼承關係(parent)、聚合關係(modules)。
依賴關係舉例:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.6.ga</version>
<
</dependency>
繼承關係舉例:
�
繼承其他pom.xml配置的內容。
m
maven提供了一個類似java.lang.Object的頂級父pom.xml檔案。
�
可以通過下面命令檢視當前pom.xml受到超pom.xml檔案的影響:mvn help:effective-pom。
建立一個各種專案可複用的pom.xml檔案:http://easymorse.googlecode.com/svn/trunk/pom/pom.xml
部署要複用的pom.xml檔案:mvn install。
在自己的pom檔案中繼承上述pom:<parent>
<groupId>com.easymorse</groupId>
<artifactId>pom</artifactId>
<version>0.1</version>
<
</parent>
聚合關係舉例:
用於將多個maven專案聚合為一個大的專案。
�
比如目錄結構如下:
.
.
|
|-- pom.xml
|
|-- module-a
`-- pom.xml
|
|-- module-b
`-- pom.xml
|
|-- module-c
`-- pom.xml
|
|-- foo-all
`-- pom.xml
�
那麼總的pom.xml檔案類似:
.
...
<modules>
<module>module-a</module>
<module>module-b</module>
<module>module-c</module>
<module>foo-all</module>
</modules>
<
</project>把專案部署到tomcat下的做法:tomcat配置有管理許可權的使用者:conf\tomcat-users.xml。 <?xml version='1.0' encoding='utf-8'?><tomcat-users> <role rolename="manager"/> <user username="marshal" password="password" roles="manager"/></tomcat-users> 在pom檔案的tomcat外掛中新增:<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>tomcat-maven-plugin</artifactId> <configuration> <url>http://localhost:8080/manager</url> <server>myserver</server> <path>/mycontext</path> </configuration></plugin> 在.m2/settings.xml檔案中增加:<settings xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/settings-1.0.0.xsd"> <servers> <server> <id>myserver</id> <username>marshal</username> <password>password</password> </server> </servers></settings> 執行打包部署,在maven專案目錄下: mvn tomcat:deploy 然後訪問:http://localhost:8080/mycontext/ 即可。撤銷部署: mvn tomcat:undeploy 啟動web應用:mvn tomcat:start 停止web應用:mvn tomcat:stop 重新部署:mvn tomcat:redeploy 部署展開的war檔案: mvn war:exploded tomcat:exploded --------------------------------------------------------------------------------------
pom是指project object Model。pom是一個xml,在maven2裡為pom.xml。是maven工作的基礎,在執行task或者goal時,maven會去專案根目錄下讀取pom.xml獲得需要的配置資訊
pom檔案中包含了專案的資訊和maven build專案所需的配置資訊,通常有專案資訊(如版本、成員)、專案的依賴、外掛和goal、build選項等等。
pom是可以繼承的,通常對於一個大型的專案或是多個module的情況,子模組的pom需要指定父模組的pom。
project pom檔案的頂級元素。
modelVersion 所使用的object model版本,為了確保穩定的使用,這個元素是強制性的。除非maven開發者升級模板,否則不需要修改。
groupId 是專案建立團體或組織的唯一標誌符,通常是域名倒寫,如groupId org.apache.maven.plugins就是為所有maven外掛預留的。
artifactId 是專案artifact唯一的基地址名。
packaging artifact打包的方式,如jar、war、ear等等。預設為jar。這個不僅表示專案最終產生何種字尾的檔案,也表示build過程使用什麼樣的<a href="http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings" target="_blank">lifecycle</a>。
version artifact的版本,通常能看見為類似0.0.1-SNAPSHOT,其中SNAPSHOT表示專案開發中,為開發版本。
name 表示專案的展現名,在maven生成的文件中使用。
url表示專案的地址,在maven生成的文件中使用。
description 表示專案的描述,在maven生成的文件中使用。
dependencies 表示依賴,在子節點dependencies中新增具體依賴的groupId artifactId和version。
build 表示build配置。
parent 表示父pom。
其中groupId:artifactId:version唯一確定了一個artifact。
Artifact
這個有點不好解釋,大致說就是一個專案將要產生的檔案,可以是jar檔案,原始檔,二進位制檔案,war檔案,甚至是pom檔案。每個artifact都由groupId:artifactId:version組成的識別符號唯一識別。需要被使用(依賴)的artifact都要放在倉庫(見Repository)中。
Repositories
Repositories是用來儲存Artifact的。如果說我們的專案產生的Artifact是一個個小工具,那麼Repositories就是一個倉庫,裡面有我們自己建立的工具,也可以儲存別人造的工具,我們在專案中需要使用某種工具時,在pom中宣告dependency,編譯程式碼時就會根據dependency去下載工具(Artifact),供自己使用。
對於自己的專案完成後可以通過mvn install命令將專案放到倉庫(Repositories)中
倉庫分為本地倉庫和遠端倉庫,遠端倉庫是指遠端伺服器上用於儲存Artifact的倉庫,本地倉庫是指本機儲存Artifact的倉庫,對於windows機器本地倉庫地址為系統使用者的.m2/repository下面。
Build Lifecycle
是指一個專案build的過程。maven的Build Lifecycle分為三種,分別為default(處理專案的部署)、clean(處理專案的清理)、site(處理專案的文件生成)。他們都包含不同的lifecycle。
Build Lifecycle是由phases構成的,下面重點介紹default Build Lifecycle幾個重要的phase:
validate 驗證專案是否正確以及必須的資訊是否可用;
compile 編譯原始碼;
test 測試編譯後的程式碼,即執行單元測試程式碼;
package 打包編譯後的程式碼,在target目錄下生成package檔案;
integration-test 處理package以便需要時可以部署到整合測試環境;
verify 檢驗package是否有效並且達到質量標準;
install 安裝package到本地倉庫,方便本地其它專案使用;
deploy 部署,拷貝最終的package到遠端倉庫和替他開發這或專案共享,在整合或釋出環境完成。
以上的phase是有序的(注意實際兩個相鄰phase之間還有其他phase被省略,完整phase見lifecycle),下面一個phase的執行必須在上一個phase完成後
若直接以某一個phase為goal,將先執行完它之前的phase,如mvn install
將會先validate、compile、test、package、integration-test、verify最後再執行install phase。
Goal
goal代表一個特定任務
A goal represents a specific task (finer than a build phase) which contributes to the building and managing of a project.
如
mvn package表示打包的任務,通過上面的介紹我們知道,這個任務的執行會先執行package phase之前的phase
mvn deploy表示部署的任務
mven clean install則表示先執行clean的phase(包含其他子phase),再執行install的phase。