Maven實戰讀書筆記(3)

POM是什麼?java

1、像MakeMakefileAntbuild.xml同樣,Maven項目的核心是pom.xmlweb

2POM (Project Object Model, 項目對象模型) 定義了項目的基本信息,用於描述項目如何構建,聲明項目依賴等等apache

 

如何編寫一個Hello WorldPOM?app

新建一個名爲pom.xml的文件,輸入內容以下:dom

<?xml version="1.0" encoding="UTF-8"?>maven

<project 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.0性能

       http://maven.apache.org/maven/-v4_0_0.xsd">單元測試

       <modelVersion>4.0.0</modelVersion>

       <groupId>com.juvenxu.mvnbook</groupId>

       <artifactId>hello-world</artifactId>

       <version>1.0-SNAPSHOT</version>

       <name>Maven Hello World Project</name>

</project>

 

對樓上的配置進行解釋

1、代碼的第一行是XML頭,指定了該xml文檔的版本和編碼方式

2、緊接着的project元素,project是全部pom.xml的根元素,它還聲明瞭一些POM相關的命名空間及xsd元素(雖然這些屬性不是必須的,但使用這些屬性可以讓第三方工具,如IDE中的XML編輯器,幫助咱們快速編輯POM)

3、根元素下的第一個子元素modelVersion指定了當前POM模型的版本,對於Maven2Maven3來講,它只能是4.0.0

4、最重要的groupIdartifactIdversion,這三個元素定義了一個項目基本的座標,在Maven的世界,任何的jarpom或者war都是以基於這些基本的座標進行區分的

 

groupId是什麼意思?

groupId定義了項目屬於哪一個組,這個組每每和項目所在的組織或公司存在關聯,好比在googlecode上創建了一個名爲myapp的項目,那麼groupId就應該是com.googlecode.myapp

 

artifactId是什麼意思?

artifactId用於定義該項目下的某個模塊,好比myapp-utilmyapp-domainmyapp-web

 

version是什麼意思?

version指定了Hello World項目當前的版本——1.0.SNAPSHOT

 

SNAPSHOT是什麼意思?

SNAPSHOT意爲快照,說明該項目還處於開發中,是不穩定的版本。隨着項目的發展,version會不斷更新,如升級爲1.01.1-SNAPSHOT1.12.0

 

最後的是name是什麼意思?

最後的name元素聲明瞭一個對於用戶更爲友好的項目名稱,雖然這不是必須的,但仍是推薦爲每一個POM聲明name,以方便信息交流

 

Maven中的項目主代碼和測試代碼分別是指?

1、項目的主代碼會被打包到最終構建中(jar)

2、項目的測試代碼只在運行測試時用到,不會被打包

3、默認狀況下,Maven假設項目主代碼位於src/main/java目錄,測試代碼位於src/test/java

 

關於Java代碼有兩點須要注意

1、應該把項目主代碼放到src/main/java目錄下(遵循Maven的約定),而無需額外的配置,Maven會自動搜尋該目錄找到項目主代碼

2、該Java類的包名是com.juvenxu.mvnbook.helloworld,這與以前在POM中定義的groupIdartifactId相吻合,通常來講,項目中Java類的包都應該基於項目的groupIdartifactId,這樣更加清晰、更加符合邏輯,也方便搜索構件或者Java

 

在項目根目錄下運行命令 mvn clean compile

1clean命令告訴Maven清理輸出目錄target,就是刪除target目錄

2compile命令告訴Maven編譯項目主代碼

3、默認狀況,Maven構建的全部輸出都在target/目錄中,compile任務將項目主代碼編譯至target/classes目錄,(target\classes\com\juvenxu\mvnbook\helloworld\HelloWorld.class)

4、執行任務順序是: clean:clean任務、resources:resources任務、compile:compile任務,resources任務是處理項目資源(src/main/resourcessrc/test/resources

 

上面提到的clean:cleanresources:resourcescompile:compile是指?

格式應該是:插件:插件目標

好比clean:cleanclean插件的clean目標,以此類推

 

引入JUnit依賴

Java世界中,由Kent BeckErich Gamma創建的Junit是事實上的單元測試標準,要使用JUnit,首先須要爲Hello World項目添加一個JUnit依賴,修改項目的POM以下:

<?xml version="1.0" encoding="UTF-8"?>

<project 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.0

       http://maven.apache.org/maven/-v4_0_0.xsd">

       <modelVersion>4.0.0</modelVersion>

       <groupId>com.juvenxu.mvnbook</groupId>

       <artifactId>hello-world</artifactId>

       <version>1.0-SNAPSHOT</version>

       <name>Maven Hello World Project</name>

       <dependencies>

              <dependency>

                     <groupId>junit</groupId>

                     <artifactId>junit</artifactId>

                     <version>4.7</version>

                     <scope>test</scope>

              </dependency>

       </dependencies>

</project>

 

對上面配置進行解釋

1、配置中添加了dependencies元素,該元素下能夠包含多個dependency元素

2、添加junit座標,Maven自動下載junit-4.7.jar

3scope元素指的是依賴範圍

 

依賴範圍是指?

1、若依賴範圍爲test表示該依賴只對測試有效,換句話說,測試代碼中import JUnit代碼是沒問題的,可是若是在主代碼中用import JUnit代碼,就會形成編譯錯誤。

2、若不聲明依賴範圍,那麼默認值就是compile,表示該依賴對主代碼和測試代碼都有效

 

一個典型的單元測試包含三個步驟

1、準備測試類及數據

2、執行要測試的行爲

3、檢查結果

另外JUnit3中,約定全部須要執行測試的方法都以test開頭,JUnit4中,測試方法都以@Test 進行標註

 

執行mvn clean test
執行該命令會依次執行以下任務:

任務名

插件和版本號

Clean

Maven-clean-plugin:2.5

Resources

Maven-resources-plugin:2.6

Compile

Maven-compile-plugin:2.5.1

testResources

Maven-resources-plugin:2.6

testCompile

Maven-compile-plugin:2.5.1

Test

Maven-surefire-plugin:2.12.4

以後就是Surefire report directory: target\surefire-reports

執行測試,測試完成後會在target\surefire-reports下生成測試報告,一個.txt文件一個.xml文件,測試報告顯示一共運行了多少測試,失敗多少,出錯了多少,跳過了多少

 

打包和運行 mvn clean package

1、默認打包類型jar,會執行jar:jar任務

2、將主代碼打包成hello-world-1.0-SNAPSHOP.jar

3、也能夠使用finalName來自定義該文件的名稱

 

如何讓其餘的Maven項目直接引用本身的jar mvn clean install

1、執行安裝任務install:install

2、將該項目的pomjar安裝到本地倉庫,便於其餘maven項目引用

 

直接使用mvn clean install命令打包的jar文件沒法直接執行,雖然有main方法

由於帶有main方法的類信息不會添加到manifest(打開jar文件中的META-INF/MANIFEST.MF文件,將沒法看到Main-Class一行)

 

那麼如何解決jar文件有main方法可是不能執行這一問題

爲了生成可執行的jar文件,須要藉助maven-shade-plugin,配置該插件以下:

<build>

              <plugins>

                     <plugin>

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

                            <artifactId>maven-shade-plugin</artifactId>

                            <version>1.2</version>

                            <executions>

                                   <execution>

                                          <phase>package</phase>

                                          <goals>

                                                 <goal>shade</goal>

                                          </goals>

                                          <configuration>

                                                 <transformers>

                                                        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">

                                                 <mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>

                                                        </transformer>

                                                 </transformers>

                                          </configuration>

                                   </execution>

                            </executions>

                     </plugin>

              </plugins>

       </build>

plugin元素在POM中的相對位置應該是<project> <build> <plugins>下面

配置<mainClass>com.juvenxu.mvnbook.helloworld.HelloWorld</mainClass>,項目在打包時會將該信息放到MANIFEST

 

如今執行mvn clean install

target目錄下會生成兩個jar

hello-world-1.0-SNAPSHOT.jar,可執行的jar

orginal-hello-world-1.0-SNAPSHOT.jar,原始的jar

打開hello-world-1.0-SNAPSHOT.jarMETA-INF/MANIFEST.MF,能夠看到以下這樣一行信息: Main-Class: com.juvenxu.mvnbook.helloworld.HelloWorld

如今,在項目根目錄下執行: java -jar original-hello-world-1.0-SNAPSHOT.jar 結果是:Hello Maven

相關文章
相關標籤/搜索