1. 程式人生 > >maven一波流(3)——使用eclipse構建第一個maven工程

maven一波流(3)——使用eclipse構建第一個maven工程

概述

傳統工程中,jar包需要自己拷貝到專案裡面來,然後專案編譯的時候可以訪問到這些jar包,完成專案的構建工作。

但是maven專案則不同,實際上專案目錄下是沒有jar包的。maven工程對專案的結構是有特殊要求的,比如至少得有一個配置檔案,告訴工程需要引用那些 jar包。這些jar包會自動從中央倉庫下載到本地倉庫,並參與專案的構建。

本文通過一個具體的例項瞭解maven專案結構與傳統專案的不同,也瞭解下maven專案構建方式與傳統方式的不同。

新建maven專案

1、File-New-Other-Maven-Maven Project-Next

2、在New Maven Project介面直接Next

3、在Select An Archetype介面,Archetype的意思是原型,所謂原型可以理解為模版,就是有一些結構不用咱們一個個去寫,系統自動生成。此處我們選個簡單的maven-archetype-quickstart,這個原型會幫我們生成maven工程基本結構,然後Next。

4、輸入工程的資訊:

Group Id:com.panda
Artifact Id:mvndemo
Version:0.0.1-SNAPSHOT
Package:com.panda.mvndemo

注意Package是輸入Group Id和Artifact Id後自動生成的,可以理解Artifact Id是專案名,Group Id是組織機構名,此處組織機構就是個人panda了。

5、點選Finish,注意eclipse右下角有進度條,然後專案中的目錄檔案一直在增加,這是maven幫我們根據原型自動構建專案的過程。

專案目錄結構分析

根據maven-archetype-quickstart模型自動生成的專案目錄結構如下:

  • mvndemo:專案
    • src/main/java:業務程式碼
    • src/test/java:測試程式碼
    • JRE System Library:JRE庫,此處引用了JDK1.8
    • Maven Dependencies:Maven依賴庫,此處引入了由pom.xml指定的junit-3.8.1.jar
    • junit-3.8.1.jar
    • src:可以從檔案結構看到業務程式碼和測試程式碼,一般不用開啟看。
    • target:暫時不用
    • pom.xml:定義maven配置資訊

都很好理解,唯一需要正視的就是pom.xml,它定義了maven專案的依賴jar包情況,具體分析下:

<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/xsd/maven-4.0.0.xsd">
  <!-- 配置專案基本資訊 -->
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.panda</groupId>
  <artifactId>mvndemo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  <name>mvndemo</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <!-- 配置專案依賴的jar包 -->
  <dependencies>
    <!-- 一個依賴 -->
    <dependency>
      <!-- 通過groupId、artifactId、version唯一定位一個jar包,所以這是一個座標 -->
      <!-- 該座標指定的junit-3.8.1.jar被自動放入Maven Dependencies依賴庫中,程式構建時可以使用該jar -->
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

maven專案的構建

正常專案匯入jar包,編輯完程式碼,可以進行測試和打包安裝了。maven專案需要通過maven來執行這個過程,主要包括:清理、測試、打包。

清理

右鍵點選專案名稱-Run as-Maven clean,執行清理操作,控制檯輸出關鍵資訊如下:

[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ mvndemo ---
[INFO] Deleting D:WorkspaceEclipsePhotonmvndemo arget
[INFO] Total time: 0.199 s
[INFO] Finished at: 2018-09-07T16:39:35+08:00

可以看出幾點:

  1. eclipse選單Maven clean點選後實際上應該是呼叫maven完成的maven-clean清理操作
  2. 清理操作應該是刪除target目錄下生成的一些東西
  3. 在0.199s內完成了清理操作

總結來說,maven專案需要先清理下,否則可能因為之前生成的東西影響新的生成。

測試

右鍵點選專案名稱-Run as-Maven test,執行測試操作,控制檯輸出關鍵資訊如下:

Running com.panda.mvndemo.AppTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.002 sec

可以看出幾點:(如果對單元測試不熟悉的,建議去稍微瞭解下)

  1. 執行了AppTest測試類,該類因為繼承了TestCase,而TestCase實現了junit框架下的Test介面實現了單元測試功能
  2. 可以推測出,當執行Maven test測試操作時,maven會自動呼叫src/test/java下面的測試類的測試方法。因為我們已經在pom.xml配置了junit,所以此處能識別並呼叫junit單元測試方法。
  3. 測試方法程式碼如下,因為assertTrue( true );肯定斷言成功,所以最後測試結果是run:1個,沒有失敗和錯誤。
 public void testApp()
    {
        assertTrue( true );
    }
打包安裝

右鍵點選專案名稱-Run as-Maven install,執行安裝操作,控制檯輸出關鍵資訊如下:

[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ mvndemo ---
[INFO] Building jar: D:WorkspaceEclipsePhotonmvndemo    argetmvndemo-0.0.1-SNAPSHOT.jar

可以看出,在target目錄下生成了一個mvndemo-0.0.1-SNAPSHOT.jar。

執行程式

我們使用命令執行mvndemo-0.0.1-SNAPSHOT.jar

首先在D:WorkspaceEclipsePhotonmvndemo arget目錄新建mvndemo.bat指令碼,用於在windows平臺呼叫java執行生成的 mvndemo-0.0.1-SNAPSHOT.jar。

mvndemo.bat指令碼檔案內容如下:

java -jar mvndemo-0.0.1-SNAPSHOT.jar
pause

執行後如下,可見需要配置程式的入口。

D:WorkspaceEclipsePhotonmvndemo arget>java -jar mvndemo-0.0.1-SNAPSHOT.jar
mvndemo-0.0.1-SNAPSHOT.jar中沒有主清單屬性

可想而知maven程式的入口必然是在pom.xml中配置,我們在pom.xml中為project根節點增加一個build節點如下:

    <build>
        <plugins>
            <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.panda.mvndemo.App</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

所以此時就會呼叫入口類:com.panda.mvndemo.App,這個是自動生成的,程式碼如下:

public class App 
{
    public static void main( String[] args ) throws InterruptedException
    {
        System.out.println( "Hello World!" );

    }
}

OK,重新清理、生成,呼叫mvndemo.bat後:

D:WorkspaceEclipsePhotonmvndemo arget>java -jar mvndemo-0.0.1-SNAPSHOT.jar
Hello World!

OK ,大功告成,厲害炸了。

總結與補充

使用maven後,實際上對整個專案的管理,不論是程式碼結構目錄,還是編譯生成執行方式,實際上都變了。

但是都是很合理按照需求發生的變化,我們熟悉一下,也就順理成章的用就行了。

另補充下,其實不用eclipse,直接執行mvn命令也能完成整個專案的構建、生成,就像java程式也可以直接用java命令列生成一樣。有興趣的可以去了解下,有助於加深對maven的理解,當然不去看也OK,反正我也沒看。