1. 程式人生 > >maven——Myeclipse下通過maven管理專案

maven——Myeclipse下通過maven管理專案

上一篇文章,我們討論了nexus的管理與配置。那麼,當nexus配置完了之後,就相當於我們本地專案於maven中央倉庫這個橋樑已經搭好了,剩下的就是看怎麼通過怎樣的配置來使用nexus。在本地開發的時候,主要牽涉到兩個配置檔案,一個是settings.xml(%M2_HOME%/conf/settings.xml和%USER_HOME%\.m2\settings.xml),一個是專案中的pom.xml。所有的主要配置都集中在這兩個配置檔案中,下邊咱們就通過一個實際的專案的例子來說說這兩個配置檔案的用法。

再講解之前,我先把我本地建立的一個專案的例子原始碼發上來,下邊講的內容和它是對應的,我建立一個名字叫做onlinestore的一個專案。

1.專案描述

我們先從這個專案開始說起。onlinestore是一個主專案,onlinestore-core、onlinestore-interf、onlinestore-chinaweb、onlinestore-americaweb是onlinestore的4個子專案(其中前兩個是java專案,後邊兩個是web專案)。在這裡說子專案,可能大家還有些不太習慣或者不太好理解,這個子與父的關係,我們在後邊會再說。注意:這裡我起的線上商店這個專案,裡邊沒有什麼實質性的程式碼,只是想的框架和主要的配置檔案。下邊截圖是這幾個專案的工程結構圖:m15在圖中我們可以看到父專案和子專案在MyEclipse裡邊是平級的關係,在磁碟的目錄結構中,子專案在父專案所在的資料夾中,如下圖:

maven16其實在這兩個截圖中,都看不出裡邊的父子關係,真正的父子關係,在哪裡定義呢?在pom.xml檔案中,我們開啟父專案的pom.xml檔案,裡邊可以找到:

<modules>
<module>onlinestore-core</module>
<module>onlinestore-interf</module>
<module>onlinestore-chinaweb</module>
<module>onlinestore-americaweb</module>
</modules>

另外,在4個子專案的pom.xml的檔案中,也能找到類似的:

<parent>
<artifactId>parent</artifactId>
<groupId>com.uuwit.onlinestore</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>

也就是說,在父專案和子專案中,都有說明他們之間的關係。

說到這裡,咱們說一下為什麼要建立父專案和子專案,他們之間到底有著什麼樣的聯絡。通常一個大的專案會將專案分成多個模組,比如上邊咱們舉的例子,core是專案的一些核心類或者元件,interf放介面類,其餘兩個分別是兩個相對獨立的web模組。正常情況下,兩個web模組比如會依賴core和interf這兩個專案。而兩個web專案之間通常並不會有依賴關係,但是他們之間卻有很多共性的東西,比如說很多類似的配置、很多類似的jar包等等,這時候父專案和子專案的優勢就能體現出來了。我們知道maven父專案和子專案的pom.xml是有繼承關係的,也就是說各個模組相同的部分,我們可以配置到父專案的pom.xml檔案中,這樣子專案中的pom.xml只放自己個性的東西就可以了,這大大減少了工作量。另外,在編譯和打包等其他階段,都可以統一在父專案中來進行,maven會自動操作其中的子專案,提高了效率。

【注意:】事實上,所有的maven專案都會繼承一個超級pom,這個pom就是%M2_HOME%\lib\maven-2.2.1-uber.jar中的org\apache\maven\project\pom-4.0.0.xml。

2.配置nexus

我們知道,我們假設倉庫管理器的目的是為了減少與中央倉庫的互動,既然這樣,那我們在本地肯定要配置nexus的相關資訊,以便能夠把中央倉庫的配置覆蓋掉,從而真正來使用nexus。

兩個步驟:

1.開啟settings.xml檔案:

<mirrors>
<!– mirror
| Specifies a repository mirror site to use instead of a given repository. The repository that
| this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
| for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
|
–>
<mirror>
<id>nexus-public-snapshots</id>
<mirrorOf>public-snapshots</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public-snapshots</url>
</mirror>
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8081/nexus/content/groups/public</url>
</mirror>
</mirrors>

找到mirrors標籤,在其中新增上邊的配置,其中的localhots:8081根據自己的具體情況修改。

2.開啟父專案的pom.xml檔案,新增如下配置:

<distributionManagement>
<repository>
<id>repo</id>
<name>public</name>
<url>http://localhost:8081/nexus/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url>http://localhost:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>

</distributionManagement>

其中的localhots:8081根據自己的具體情況修改。

好了,就這麼簡單,就配置好了,如何驗證一下專案真的不去找中央倉庫的麻煩了呢?可以這麼測試一下,你把你專案中使用到的一些構件在本地的maven倉庫刪除掉,然後再編譯一下專案,在控制檯列印的日誌中,你能夠清晰的看到都是從nexus中downlaod的,而在之前都是列印從中央倉庫獲取的。

3.java專案的幾個操作

3.1編譯

mvn compile,編譯java專案,java檔案將會被編譯成class檔案放到target/classes目錄下

3.2打包

mvn package,打包java專案,專案將會打包成jar檔案放到target目錄下,jar檔案的命名規則是:${project.artifactId}-${project.version}.jar

cmd 進入到有oracle包ojdbc6的目錄

mvn install:install-file -DgroupId=com.oracle -DartifactId=oracle -Dversion=11.2 -Dpackaging=jar -Dfile=ojdbc6.jar

pom.xml中新增

<dependency>
        <groupId>com.oracle</groupId>
        <artifactId>oracle</artifactId>
        <version>11.2</version>
    </dependency>

3.3安裝

安裝的作用是將打包好的jar檔案安裝到本地的mavan倉庫中,以供其他專案(如果其他專案依賴該專案的話)使用。

mvn install,在maven倉庫中存放的目錄結構是:${project.groupId}–>${project.artifactId}–>${project.version}

3.4部署

部署的作用是將打包好的jar檔案上傳到nexus中,以供其他同伴(如果其他同伴依賴該專案的話)使用。

mvn deploy,在這裡要注意,在部署的時候,會提示401錯誤,此時你需要在setting.xml檔案中新增鑑權資訊,即在部署的時候需要使用nexus給分配的賬戶來上傳。

在settings.xml中找到servers標籤,在其中新增如下配置:

<server>
<id>repo</id>
<username>admin</username>
<password>admin123</password>
</server>

<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>

其中的使用者名稱和密碼是nexus分配的,其中的id一定要和父專案中pom.xml檔案中剛才配置的repository和rnapshotRepository的id一致。

4.web專案的幾個操作

先貼一下web專案的pom.xml的build標籤:

<build>
<finalName>onlinestore-chinaweb</finalName>
<outputDirectory>src/main/webapp/WEB-INF/classes</outputDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!–
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.7.2</version>
<configuration>
<parallel>methods</parallel>
<threadCount>10</threadCount>
<argLine>-Dfile.encoding=UTF-8</argLine>
<skip>true</skip>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<plugin>
<groupId>maven</groupId>
<artifactId>maven-clover-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
–>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
<warName>onlinestore-chinaweb</warName>
<attachClasses>true</attachClasses>
<classesClassifier>classes</classesClassifier>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<webappDirectory>${project.build.directory}/onlinestore-chinaweb
</webappDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<charset>${project.build.sourceEncoding}</charset>
<url>http://localhost:8080/manager</url>
<!– <server>tomcat.server</server> –>
<path>/onlinestore-chinaweb</path>
<port>8080</port>
<warSourceDirectory>src/main/webapp</warSourceDirectory>
<warFile>${project.build.directory}/onlinestore-chinaweb.war</warFile>
<uriEncoding>${project.build.sourceEncoding}</uriEncoding>

</configuration>
</plugin>
</plugins>
</build>

4.1全域性配置

  1. outputDirectory要重新指定,指定到src/main/webapp/WEB-INF/classes目錄下,否則預設會是在test/classes目錄

4.2war外掛

配置比較簡單,不再累述。

4.3tomcat外掛

tomcat外掛可以讓你不使用外部的tomca,而使用起內嵌的tomcat,這樣更省勁,更簡單。如果你不想使用內嵌的tomcat,也可以單獨指定,需要在<configuration>標籤中指定tomcat的server的id,這個id也需要在settings.xml中的servers標籤中定義。

其中的tomcat埠可以自己指定。