Hello Maven

最近因爲接觸Android SDK類的項目,需要支持Maven構建APK的過程中進行代碼植入,所以開始學習如何使用Maven管理Android工程。以下是百度百科關於Maven的介紹:

Maven是基於項目對象模型(POM),可以通過一小段描述信息來管理項目的構建,報告和文檔的軟件項目管理工具

Maven 除了以程序構建能力爲特色之外,還提供高級項目管理工具。由於 Maven 的缺省構建規則有較高的可重用性,所以常常用兩三行 Maven 構建腳本就可以構建簡單的項目。由於 Maven 的面向項目的方法,許多 Apache Jakarta 項目發文時使用 Maven,而且公司項目採用 Maven 的比例在持續增長。

Maven這個單詞來自於意第緒語,意爲知識的積累,最早在Jakata Turbine項目中它開始被用來試圖簡化構建過程。當時有很多項目,它們的Ant build文件僅有細微的差別,而JAR文件都由CVS來維護。於是Maven創始者開始了Maven這個項目,該項目的清晰定義包括,一種很方便的發佈項目信息的方式,以及一種在多個項目中共享JAR的方式。

第一次看完,也沒什麼感覺,基本看完就忘,所以開始入手第一個Maven Project。

首先,是下載Maven,地址:http://maven.apache.org/download.cgi

然後設置環境變量:

MAVEN_HOME : D:\apache-maven-3.0.2 
MAVEN : %MAVEN_HOME%\bin 

(可選) MAVEN_OPTS : -Xms256m -Xmx512m

可選的暫時沒管它。

雖然完全一腦袋漿糊,不過還是按照網上的操作步驟,入手第一個工程。

1、創建項目

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=my-app

使用上面的命令,結果悲劇:

經過一番搜索,把archetype:create改成archetype:generate再試:

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app

一番滾動後,提示:

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 615:

本來只想搜這一句,沒想到搜到個全面的(感謝菩提樹下的楊過http://www.cnblogs.com/yjmyzz/p/3495762.html)

...

[INFO] Generating project in Interactive mode (這裏會卡一會兒,因爲要聯網獲取項目模板)
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)
Choose archetype:
1: remote -> br.com.ingenieux:elasticbeanstalk-service-webapp-archetype (A Maven Archetype Encompassing RestAssured, Jetty, Jackson, Guice and Jersey for Publishing JAX-RS-based Services on AWS' Elastic Beanstalk Service)
... (這裏會自動列出很多項目模板,每種模板前面會有一個數字序號)

336: remote -> org.apache.maven.archetypes:maven-archetype-quickstart (An archetype which contains a sample Maven project.)

...

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 336: (這裏根據每個人機器上安裝的eclipse插件不同,可能默認的數字不是這個,先不管,直接回車)

Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 
1: 1.0-alpha-1
2: 1.0-alpha-2
3: 1.0-alpha-3
4: 1.0-alpha-4
5: 1.0
6: 1.1
Choose a number: 6: (直接回車)
Define value for property 'groupId': : cnblogs (可暫時先理解成類似package或namespace的名稱,通常我們填寫組織機構名稱縮寫)
Define value for property 'artifactId': : maven-hello-world (組件名稱,可暫時理解成項目名稱)
Define value for property 'version':  1.0-SNAPSHOT: : (版本號,直接回車,默認1.0-SNAPSHOT)
Define value for property 'package':  cnblogs: : (打包後的jar文件名,相當於.net中項目最後生成的程序集dll名稱)
Confirm properties configuration:
groupId: cnblogs
artifactId: maven-hello-world
version: 1.0-SNAPSHOT
package: cnblogs
 Y: :  (直接回車確認)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: cnblogs
[INFO] Parameter: packageName, Value: cnblogs
[INFO] Parameter: package, Value: cnblogs
[INFO] Parameter: artifactId, Value: maven-hello-world
...
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS (看到這個,表示項目創建成功!)
[INFO] ------------------------------------------------------------------------
...

2、項目結構


maven項目採用“約定優於配置”的原則,src/main/java約定用於存放源代碼,src/main/test用於存放單元測試代碼,src/target用於存放編譯、打包後的輸出文件。這是全世界maven項目的通用約定,請記住這些固定的目錄結構。

3、編譯

進入項目根目錄,執行 mvn clean compile

編譯後會自動在target目錄中生成class文件,如果編譯成功,會輸出類似下面的信息

yangjunmingmatoMacBook-Pro-7:maven-hello-world jimmy$ mvn clean compile
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building maven-hello-world 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven-hello-world ---
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven-hello-world ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/jimmy/Desktop/study/maven-hello-world/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.5.1:compile (default-compile) @ maven-hello-world ---
[INFO] Compiling 1 source file to /Users/jimmy/Desktop/study/maven-hello-world/target/classes
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.515s
[INFO] Finished at: Wed Jan 01 19:08:32 CST 2014
[INFO] Final Memory: 10M/156M
[INFO] ------------------------------------------------------------------------

4、單元測試

這部分暫時不關心,不過還是把命令記下:mvn clean test(每次看到google源碼裏齊齊整整的test代碼,都心生憧憬,國內還是算了吧!)

5、項目打包

通常我們會把java項目打包成jar包或war包,maven中打包的命令爲

mvn clean package

運行完後,會在target目錄下生成jar包

注:從輸出 可以發現,package前,會先執行compile,再執行test,最後纔是package打包

6、項目運行

該項目中的App.java中有main方法,可以直接運行,常規方式下,我們如果想直接運行class文件,得敲一段很長的命令,maven中不必這麼複雜,先用記事本打開項目根目錄下的pom.xml文件,增加下面這節內容:

    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>exec</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <executable>java</executable>          
                    <arguments>                       
                        <argument>-classpath</argument>
                        <classpath>
                        </classpath>
                        <argument>t>com.mycompany.app.App</argument>
                    </arguments>
                </configuration>
            </plugin>
        </plugins>
    </build>

上述這段內容插入在</project>之前即可。

然後在命令行下,輸入

mvn exec:exec

即可直接運行,下面是輸出:

C:\test\maven-hello-world>mvn exec:exec
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building maven-hello-world 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- exec-maven-plugin:1.2.1:exec (default-cli) @ maven-hello-world ---
Hello World!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.175s
[INFO] Finished at: Mon Jan 13 22:35:02 CST 2014
[INFO] Final Memory: 6M/111M
[INFO] ------------------------------------------------------------------------

另外:

有時候,我們的項目是一個類庫,只是封裝一些方法供其它項目引用,對於這種項目,我們可以用 mvn clean install 把生成的jar包,安裝到“本地倉庫”中,這樣本機其它項目需要使用該jar包時,只要在pom裏配置依賴項即可,不用把jar包複製到當前項目中。

至此,一個Hello Maven工程已經創建完畢,接下來就是Maven+Android了。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章