1. 程式人生 > >maven入門淺析(一)-----maven安裝、配置、建立專案骨架、編譯、測試、打包、執行

maven入門淺析(一)-----maven安裝、配置、建立專案骨架、編譯、測試、打包、執行

一、下載及安裝

1.1 下載maven 3.2.5

先到官網http://maven.apache.org/download.cgi 下載3.2.5版本(目前最新是3.3.9),下載完成後,解壓到某個目錄(本文中是E:\apachemaven)

2.1 配置環境變數

系統環境變數裡,新增MAVEN_HOME(或M2_HOME),其值為E:\apachemaven\apache-maven-3.2.5,然後PATH環境變數最後附加上";%MAVEN_HOME%\bin"

檢測方法:

a) 重新進入命令列(DOS視窗)模式,輸入 echo %MAVEN_HOME% 如果能顯示E:\apachemaven\apache-maven-3.2.5

,說明環境變數起作用了

b) 輸入 mvn -version,正常情況下會顯示maven及jdk的版本號

(前提:jdk環境必須先安裝好,否則後面無法正常編譯專案)

插曲:

一開始我下載的是3.3.9版本,執行 echo %MAVEN_HOME% 正常,但是執行mvn -version時,報如下異常:

Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/ma
ven/cli/MavenCli : Unsupported major.minor version 51.0
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14
1)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClassFromSelf(Cl
assRealm.java:401)
        at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(
SelfFirstStrategy.java:42)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadCl
ass(ClassRealm.java:271)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm
.java:254)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm
.java:239)
        at org.codehaus.plexus.classworlds.launcher.Launcher.getMainClass(Launch
er.java:144)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Laun
cher.java:266)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.jav
a:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(La
uncher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:
356)

大致意思就是版本不匹配,解決方法就是使用的jdk要和maven相匹配,例如:
想在我使用的jdk是1.6的,maven是3.3.9,
而maven3.3.1以上的版本要求使用1.7以上的jdk,如圖:
因為我機器的jdk在別的地方有使用,
所有我的解決方法是,該變maven的版本為3.2系列。

下載後,重新配置maven的環境變數,然後再dos視窗中,
輸入命令:mvn -version
得到如下的maven把本號和jdk版本號:
Apache Maven 3.2.5 (12a6b3acb947671f09b81f49094c53f426d8cea1; 2014-12-15T01:29:2
3+08:00)
Maven home: E:\apachemaven\apache-maven-3.2.5\bin\..
Java version: 1.6.0_27, vendor: Sun Microsystems Inc.
Java home: E:\jdk1.6.0_27\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows nt (unknown)", version: "6.2", arch: "amd64", family: "windows
"


3 理解“倉庫

         首次執行完mvn -version後,會在使用者目錄下建立一個.m2的目錄(比如:C:\Users\當前使用者名稱\.m2\),這個目錄是maven的“本地倉庫”,倉庫是maven中一個很重要的概念。

試想一下,我們會在工作中同時建立很多專案,每個專案可能都會引用一些公用的jar包(.NET中是dll檔案),一種作法是每個專案裡,都複製一份這些依賴的jar包(或dll檔案),這樣顯然不好,相同的檔案在硬碟上儲存了多份,太佔用空間,而且這些依賴的jar包(或dll檔案)的版本也不太好管理(比如某個公用的jar包,從1.0升級到2.0,如果所有引用這個jar包的專案都需要更新,必須一個個專案的修改)。

maven的倉庫則很好的解決了這些問題,它在每臺機器上建立一個本機倉庫,把本機上所有maven專案依賴的jar包統一管理起來,而且這些jar包用“座標”來唯一標識(注:座標是另一個重要的概念,後面還會講到,這裡只要簡單理解成“唯一識別某個jar包檔名、版本號”的標識即可),這樣所有maven專案就不需要再象以前那樣把jar包複製到lib目錄中,整個maven專案看起來十分清爽。

4 配置代理伺服器(可選)

maven專案在編譯、測試、打包裡,會需要從maven的中央倉庫(即:maven組織公佈在網際網路上的一個站點,裡面已經收錄了目前絕大多數主流的jar包)下載jar包等檔案,如果使用代理伺服器上網,需要配置代理伺服器。

把%MAVEN_HOME%\conf\settings.xml複製一份到本地倉庫C:\Users\當前使用者名稱\.m2\下,然後編輯該檔案,找到下面這段

<proxies>
    <!-- proxy
     | Specification for one proxy, to be used in connecting to the network.
     |
    <proxy>
      <id>optional</id>
      <active>true</active>
      <protocol>http</protocol>
      <username>proxyuser</username>
      <password>proxypass</password>
      <host>proxy.host.net</host>
      <port>80</port>
      <nonProxyHosts>local.net|some.host.com</nonProxyHosts>
    </proxy>
    -->
  </proxies>

把註釋去掉,host這裡填寫代理伺服器的地址(可以用IP)以及port埠,如果需要使用者名稱/密碼認證,則填寫username/password節點,否則username/password這二個節點去掉,nonProxyHosts表示某些地址不需要經過代理伺服器,多個地址之間用|分隔,支援萬用字元,比如172.156.*

二、建立專案“骨架”

下面用命名行建立一個最基本的maven專案

2.1 mvn archetype:generate

先建立專案的根目錄,比如c:\test,命令列視窗下輸入

cd /d c:\test

mvn archetype:generate

       首次執行時,mvn會從遠端"中央倉庫"下載一些必需的檔案到"本地倉庫" - (如果你有興趣,可以在等待下載過程中,觀察一下"C:\Users\當前使用者名稱\.m2\repository"到底下載了些啥東東)

下載完成後(下一篇會講解如何,在區域網環境中搭建“私服”,直接從區域網的代理倉庫中下載這些依賴項),會自動進入互動模式,會讓你輸入一些基本資訊,類似下面這樣:

預約需要半個小時,中間還有需要點選回車的地方和輸入包名、元件名、版本號、jar檔名等。。。

...

[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.2 maven專案的目錄結構

C:\test\maven-hello-world>

C:.
├───src
│   ├───main
│   │   └───java
│   │       └───cnblogs
│   └───test
│       └───java
│           └───cnblogs
└───target
    └───classes
        └───cnblogs

注意上面帶紅色的目錄名,maven專案採用“約定優於配置”的原則,src/main/java約定用於存放原始碼,src/main/test用於存放單元測試程式碼,src/target用於存放編譯、打包後的輸出檔案。這是全世界maven專案的通用約定,請記住這些固定的目錄結構。

三、編譯專案

先進入剛才建立專案的根目錄

cd /d c:\test\maven-hello-world

然後執行 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] ------------------------------------------------------------------------

四、單元測試

mvn clean test

這樣就能做單元測試了,so easy !

如果單元測試不通過,會提示出錯資訊,注意看輸出。

注:從輸出上可以發現,test前,會先執行compile,即先編譯,再執行單元測試.

有興趣的朋友,可以修改下/src/test/java/cnblogs/AppTest.java裡的內容,把testApp()方法中的assertTrue( true );改成assertTrue( false );再跑下單元測試,看下有什麼不同

五、專案打包

通常我們會把java專案打包成jar包或war包,maven中打包的命令為

mvn clean package

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

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

六、專案執行

該專案中的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>cnblogs.App</argument>
                     </arguments>
                 </configuration>
             </plugin>
         </plugins>
     </build>

上述這段內容插入在</project>之前即可,完整程式碼如下:
<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>cnblogs</groupId>
  <artifactId>maven-hello-world</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>maven-hello-world</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  
  
  <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>cnblogs.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] ------------------------------------------------------------------------

 

七、專案部署

如果是web專案,使用命令

mvn clean jboss-as:deploy

就能自動將web專案部署到jboss中(前提是jboss web server已經成功啟動),因為剛才我們建立的是一個最基本的maven專案,並非web專案,所以執行這條命令,應該會失敗,後面會講如何在eclipse中用外掛部署web專案,這裡可以先跳過。

另外:

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


參考部落格:http://www.cnblogs.com/yjmyzz/p/3495762.html