Maven項目的核心是pom.xml。POM(Project Object Model,項目對象模型)定義了項目的基本信息,用于描述項目如何構(gòu)建,聲明項目依賴等等。
1.初識
<groupId>com.strivelearn</groupId>
<artifactId>hello-world</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
- 1.groupId
????groupId定義了項目屬于哪個組,這個組往往和項目所在的組織或公司存在關(guān)聯(lián)。
- 2.artifactId
????定義了Maven項目在組中唯一的ID。(格式:產(chǎn)品線名-模塊名)。
- 3.version
????指的項目當(dāng)前的版本(1.0-SNAPSHOT)SNAPSHOT指的是快照,說明該項目還處于開發(fā)中,是不穩(wěn)定的版本。版本命名方式:主版本號.次版本號.修訂號。(起始版本號:1.0.0)
- 主版本號:產(chǎn)品方向改變,或者大規(guī)模API不兼容,或者架構(gòu)不兼容升級。
- 次版本號:保持相對兼容性,增加主要功能特性,影響范圍極小的API不兼容修改。
- 修訂號:保持完全兼容,修復(fù)BUG,新增次要功能特性。
2.編寫主代碼
????如果實際項目開發(fā)中,需要使用到1.8的jdk,那么再使用maven進行作為項目管理的時候,一定要在pom文件里面加上compile的插件。如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
????寫好代碼后,使用Maven進行編譯,在項目根目錄下運行命令:
mvn clean compile
clean:告訴Maven清理輸出目錄target/
compile:告訴Maven編譯項目主代碼,輸出到target/classes目錄
但是除了clean,compile,還有resources的操作。如果resources文件下有資源文件的話,會以utf-8的編碼方式把資源拷貝到classes文件下。
3.編寫測試代碼
????Maven項目中默認的測試代碼目錄在src/test/java。在使用idea生成項目的時候,會自動生成,并且會自動引入測試依賴的jar包(JUnit)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
????在上面依賴的代碼里面有個值為test的元素scope,scope為依賴范圍,其值為test代表該依賴只對測試有效。如果不聲明的話,默認值為compile。代表該依賴對主代碼和測試代碼都有效。
????在JUnit中,所有執(zhí)行測試的方法都是以test開頭。需要執(zhí)行的測試方法都應(yīng)該以@Test進行標注。測試用例編寫完畢之后調(diào)用Maven命令:
mvn clean test
????執(zhí)行命令之后會在target/test-classes下生成二進制文件。并且會顯示測試多少,通過了多少,失敗了多少
4.打包和運行
????pom文件中如果沒有指定打包類型,使用默認的打包類型jar。執(zhí)行以下命令:
mvn clean package
????Maven會在打包之前執(zhí)行編譯、測試等操作。
????這時候,雖然我們可以復(fù)制這個jar文件到其他項目的Classpath中從而使用。但是如果讓其他Maven項目直接引用這個jar呢。還需要安裝步驟,執(zhí)行命令
mvn clean install
????安裝完成后,我們就可以在maven本地倉庫中,看到我們項目的pom和jar
????默認打包生成jar是不能夠直接運行的,因為帶有main方法的類信息不會加載添加到manifest中。(打開jar文件中的META-INF/MANIFEST.MF文件,將無法看到Main-Class一行)
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: strivelearn
Created-By: Apache Maven 3.5.2
Build-Jdk: 1.8.0_151
加入maven-shade-plugin插件。通過設(shè)置 MainClass 創(chuàng)建一個可執(zhí)行 Jar 包。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.strivelearn.App</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
????最終在MANIFEST.MF里有了Main-Class
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Built-By: strivelearn
Created-By: Apache Maven 3.5.2
Build-Jdk: 1.8.0_151
Main-Class: com.strivelearn.App
這時候,可以cd到j(luò)ar的根目錄執(zhí)行
java -jar hello-world.jar。那么就可以得到想要的結(jié)果了。
5.使用Archetype生成Maven項目
????Maven項目的約定是根目錄放置pom.xml文件。在src/main/java目錄中放置項目的主代碼,在src/test/java中放置項目的測試代碼。
????當(dāng)我們用maven archetype來創(chuàng)建項目骨架的時候,這些默認的約定直接給我們搭載好了。
mvn archetype:generate