POM是什麼?java
1、像Make的Makefile、Ant的build.xml同樣,Maven項目的核心是pom.xmlweb
2、POM (Project Object Model, 項目對象模型) 定義了項目的基本信息,用於描述項目如何構建,聲明項目依賴等等apache
如何編寫一個Hello World的POM?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模型的版本,對於Maven2及Maven3來講,它只能是4.0.0
4、最重要的groupId、artifactId和version,這三個元素定義了一個項目基本的座標,在Maven的世界,任何的jar、pom或者war都是以基於這些基本的座標進行區分的
groupId是什麼意思?
groupId定義了項目屬於哪一個組,這個組每每和項目所在的組織或公司存在關聯,好比在googlecode上創建了一個名爲myapp的項目,那麼groupId就應該是com.googlecode.myapp
artifactId是什麼意思?
artifactId用於定義該項目下的某個模塊,好比myapp-util、myapp-domain、myapp-web等
version是什麼意思?
version指定了Hello World項目當前的版本——1.0.SNAPSHOT
SNAPSHOT是什麼意思?
SNAPSHOT意爲快照,說明該項目還處於開發中,是不穩定的版本。隨着項目的發展,version會不斷更新,如升級爲1.0、1.1-SNAPSHOT、1.1、2.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中定義的groupId和artifactId相吻合,通常來講,項目中Java類的包都應該基於項目的groupId和artifactId,這樣更加清晰、更加符合邏輯,也方便搜索構件或者Java類
在項目根目錄下運行命令 mvn clean compile
1、clean命令告訴Maven清理輸出目錄target,就是刪除target目錄
2、compile命令告訴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/resources、src/test/resources)
上面提到的clean:clean、resources:resources、compile:compile是指?
格式應該是:插件:插件目標
好比clean:clean是clean插件的clean目標,以此類推
引入JUnit依賴
在Java世界中,由Kent Beck和Erich 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
3、scope元素指的是依賴範圍
依賴範圍是指?
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、將該項目的pom和jar安裝到本地倉庫,便於其餘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.jar的META-INF/MANIFEST.MF,能夠看到以下這樣一行信息: Main-Class: com.juvenxu.mvnbook.helloworld.HelloWorld
如今,在項目根目錄下執行: java -jar original-hello-world-1.0-SNAPSHOT.jar 結果是:Hello Maven