Maven系列 6.Maven原型

6. Maven原型
 
    到目前爲止,您已手動創建了一個Maven項目,生成文件夾並從頭開始創建pom.xml文件。這可能變得乏味,特別是當你經常要創建項目。爲了解決這個問題,Maven提供原型。 Maven原型是允許用戶輕鬆地生成新項目的項目模板。
    Maven原型還提供了一個很好的平臺來分享最佳實踐,並強制實現除Maven標準目錄結構之外的一致性。例如,企業可以使用公司的品牌級聯樣式表(CSS),批准的JavaScript庫和可重用組件創建原型。使用這種原型生成項目的開發人員將自動符合公司的標準。
    內置原型
    Maven提供了數百種開箱即用的原型供開發人員使用。此外,許多開源項目提供了可以下載和使用的其他原型。 Maven還提供了一個原型插件,目標是創建原型並從原型生成項目。

    原型插件的生成目標允許您查看和選擇要使用的原型。清單6-1顯示了在命令行中運行generate goal的結果。你可以看到,有491個原型可供選擇。本章將討論使用這些原型中的一些。

清單6-1。 Maven生成目標

$mvn archetype:generate
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom >>>
[INFO]
[INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom <<<
[INFO]
[INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom
[INFO] Generating project in Interactive mode
[INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0)......................................................1176: remote -> ru.yandex.qatools.camelot:camelot-plugin (-)1177: remote -> se.vgregion.javg.maven.archetypes:javg-minimal-archetype (-)1178: remote -> sk.seges.sesam:sesam-annotation-archetype (-)1179: remote -> tk.skuro:clojure-maven-archetype (A simple Maven archetype for Clojure)1180: remote -> tr.com.lucidcode:kite-archetype (A Maven Archetype that allows users to create a Fresh Kite project)1181: remote -> uk.ac.rdg.resc:edal-ncwms-based-webapp (-)1182: local -> com.inflinx.book.ldap:practical-ldap-empty-archetype (-)1183: local -> com.inflinx.book.ldap:practical-ldap-archetype (-)Choose a number or apply filter (format: 
[groupId:]artifactId, case sensitive contains):

生成Web項目
     Maven提供了用於生成Web應用程序的maven-archetype-webapp原型。 讓我們通過在C:\ apress \ gswm-book \ chapter6文件夾中運行以下命令來生成應用程序:   
mvn archetype:generate -DarchetypeArtifactId = maven-archetype-webapp
     命令以交互模式運行。 輸入所請求輸入的以下信息:    

Define value for property 'groupId': : com.apress.gswmbook
Define value for property 'artifactId': : gswm-web
Define value for property 'version':  1.0-SNAPSHOT: :  <<Hit Enter>>
Define value for property 'package':  com.apress.gswmbook: : war
Confirm the properties configuration:
groupId: com.apress.gswmbook
artifactId: gswm-web
version: 1.0-SNAPSHOT
package: war 
Y: <<Hit Enter>>
     生成的目錄結構應類似於圖6-1所示的結構。


圖6-1。 Maven web項目結構    
     pom.xml文件是最小的,並且只有JUnit依賴項。 Maven使使用嵌入式Web服務器(如Tomcat和Jetty)運行Web應用程序變得更容易。 清單6-2顯示了添加了Tomcat插件的修改的pom.xml文件。
     清單6-2。 使用嵌入式Tomcat插件修改pom.xml

<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/maven-v4_0_0.xsd">  
<modelVersion>4.0.0
</modelVersion>  
<groupId>com.apress.gswmbook
</groupId>  
<artifactId>gswm-web
</artifactId>  
<packaging>war
</packaging>  
<version>1.0-SNAPSHOT
</version>  
<name>gswm-web Maven Webapp
</name>  
<url>http://maven.apache.org
</url>  
<dependencies>    
<dependency>      
<groupId>junit
</groupId>      
<artifactId>junit
</artifactId> 
<version>3.8.1
</version>      
<scope>test
</scope>    
</dependency>  
</dependencies>  
<build>    
<finalName>gswm-web
</finalName>    
<plugins>      
<plugin>        
<groupId>org.apache.tomcat.maven
</groupId>        
<artifactId>tomcat7-maven-plugin
</artifactId>        
<version>2.2
</version>      
</plugin>    
</plugins>  
</build>
</project>

爲了在Tomcat服務器內啓動Web應用程序,請在項目的根目錄運行以下命令:    
mvn tomcat7:run
     您將看到類似於清單6-3所示的項目部署和視圖輸出。

     清單6-3。 輸出從Tomcat運行命令

Oct 11, 2014 12:08:43 PM org.apache.catalina.core.StandardService startInternalINFO: Starting service TomcatOct 11, 2014 12:08:43 PM 
org.apache.catalina.core.StandardEngine startInternalINFO: Starting Servlet Engine: Apache Tomcat/7.0.47Oct 11, 2014 12:08:45 PM 
org.apache.catalina.util.SessionIdGenerator createSecureRandomINFO: 
Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [334] milliseconds.
Oct 11, 2014 12:08:45 PM org.apache.coyote.AbstractProtocol startINFO: Starting ProtocolHandler ["http-bio-8080"]

現在啓動瀏覽器並導航到http:// localhost:8080 / gswm-web /。 您應該看到如圖6-2所示的網頁。
      
       圖6-2。 Web項目在瀏覽器中啓動
    

多模塊項目
     Java Enterpise Edition(JEE)項目通常分爲幾個模塊,以簡化開發和可維護性。 這些模塊中的每一個都生成諸如Enterprise JavaBeans(EJB),Web服務,Web項目和客戶端jar之類的工件。 Maven支持開發這樣大的JEE項目,允許多個Maven項目嵌套在單個Maven項目下。 這種多模塊項目的佈局如圖6-3所示。 父項目有一個pom.xml文件和其中的各個Maven項目。


圖6-3。多模塊項目結構
      在本節的其餘部分中,我們將解釋如何爲必須將大型項目拆分爲提供用戶界面的Web應用程序(WAR工件),保存的服務項目(JAR工件)的場景構建多模塊項目服務層代碼,以及持有您的存儲庫層代碼的持久性項目。圖6-4提供了此場景的可視化表示。

圖6-4。 Maven多模塊項目
    讓我們通過生成父項目來開始這個過程。爲此,請在C:\ apress \ gswm-book \ chapter6下的命令行中運行以下命令:
    
mvn archetype:generate -DgroupId = com.apress.gswmbook -DartifactId = gswm-parent -Dversion = 1.0.0-SNAPSHOT -DarchetypeGroupId = org.codehaus.mojo.archetypes -DarchetypeArtifactId = pom-root
    原型pom-root創建gswm-parent文件夾和其下的pom.xml文件。如清單6-4所示,生成的pom.xml文件內容很少。請注意,父項目的打包設置爲pom類型。
    清單6-4。父pom.xml文件

<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.apress.gswmbook
</groupId>  
<artifactId>gswm-parent
</artifactId>  
<version>1.0.0-SNAPSHOT
</version>  
<packaging>pom
</packaging>  
<name>gswm-parent
</name>
</project>

然後通過在C:\ apress \ gswm-book \ chapter6 \ gswm-parent文件夾中運行以下命令來創建Web項目:  

mvn archetype:generate -DgroupId = com.apress.gswmbook -DartifactId = gswm-web -Dversion = 1.0.0-SNAPSHOT -Dpackage = war -DarchetypeArtifactId = maven-archetype-webapp
    在此Web項目生成期間,您將提供Maven座標(例如groupId,版本等)作爲生成目標的參數。這創建了gswm-web項目。
    下一步是創建服務項目。在C:\ apress \ gswm-book \ chapter6 \ gswm-parent下運行以下命令:  
mvn archetype:generate -DgroupId = com.apress.gswmbook -DartifactId = gswm-service -Dversion = 1.0.0-SNAPSHOT -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
    請注意,您沒有提供包參數,因爲maven-archetype-quickstart默認情況下會生成JAR項目。另外,注意使用interactiveMode參數。這指示Maven簡單地運行命令,而不提示用戶輸入。
    類似於上一步,通過在C:\ apress \ gswm-book \ chapter6 \ gswm-parent下運行以下命令來創建另一個Java項目gswm-repository:   
mvn archetype:generate -DgroupId = com.apress.gswmbook -DartifactId = gswm-repository -Dversion = 1.0.0-SNAPSHOT -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false

現在你已經生成了所有項目,讓我們看看gswm-parent下的pom.xml文件。清單6-5顯示了pom.xml文件。
    清單6-5。父pom.xml包含模塊的文件

<?xml version="1.0" encoding="UTF-8"?>
<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.apress.gswmbook
</groupId>  
<artifactId>gswm-parent
</artifactId>  
<version>1.0.0-SNAPSHOT
</version>  
<packaging>pom
</packaging>  
<name>gswm-parent
</name>  
<modules>    
<module>gswm-web
</module>    
<module>gswm-service
</module>    
<module>gswm-repository
</module>  
</modules>
</project>

modules元素允許您在多模塊項目中聲明子模塊。在生成每個模塊時,Maven會將它們智能地註冊爲子模塊。此外,它修改了單個模塊的pom.xml文件,並添加了父pom信息。代碼6-6顯示了gswm-web項目的pom.xml文件和父pom元素。

    代碼6-6。 Web模塊的pom.xml文件

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" 
xmlns="http://maven.apache.org/POM/4.0.0"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
<modelVersion>4.0.0
</modelVersion>  
<parent>    
<groupId>com.apress.gswmbook
</groupId>    
<artifactId>gswm-parent
</artifactId>    
<version>1.0.0-SNAPSHOT
</version>  
</parent>  
<groupId>com.apress.gswmbook
</groupId>  
<artifactId>gswm-web
</artifactId>  
<version>1.0.0-SNAPSHOT
</version>  
<packaging>war
</packaging>  
<name>gswm-web Maven Webapp
</name>  
<url>http://maven.apache.org
</url>  
<dependencies>    
<dependency>      
<groupId>junit
</groupId>      
<artifactId>junit
</artifactId>      
<version>3.8.1
</version>      
<scope>test
</scope>    
</dependency>  
</dependencies>  
<build>    
<finalName>gswm-web
</finalName>  
</build>
</project>

隨着整個基礎設施的建立,你準備建立下一個項目。要完成此任務,只需在gswm-project下運行mvn package命令,如清單6-7所示。
    清單6-7。 Maven包在父項目上運行

C:\apress\gswm-book\chapter6\gswm-parent>mvn package
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] gswm-parent
[INFO] gswm-web Maven Webapp
[INFO] gswm-service
[INFO] gswm-repository
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO]
[INFO] gswm-parent ....................................... SUCCESS 
[0.001s]
[INFO] gswm-web Maven Webapp ............................. SUCCESS 
[1.033s]
[INFO] gswm-service ...................................... SUCCESS 
[0.552s]
[INFO] gswm-repository ................................... SUCCESS 
[0.261s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.949s
[INFO] Finished at: Mon Oct 13 23:09:21 MDT 2014
[INFO] Final Memory: 6M/15M
[INFO] ------------------------------------------------------------------------

創建原型

    Maven提供了幾種方法來創建一個新的原型。這裏我們將使用現有項目來生成原型。
讓我們開始創建一個原型項目,您將使用它作爲原型創建的種子。該項目將與Servlet 3.0兼容,並且具有返回HTTP狀態代碼200的狀態Servlet。代替從頭開始創建Web項目,複製先前生成的gswm-web項目代碼並在C: \ apress \ gswm-book \ chapter6。對新複製的項目進行以下更改:   
 1.   刪除所有其他資源,例如集成開發環境(IDE)特定的文件(.project,.classpath等),您不想在原型中結束。
  2.    替換webapp / WEB-INF文件夾下的web.xml文件的內容。這將升級Web應用程序以使用Servlet 3.0:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"      version="3.0">  
<display-name>Archetype Created Web Application
</display-name>
</web-app>
3. 將Servlet 3.0依賴項添加到pom.xml文件。更新的pom.xml如清單6-8所示。

   代碼6-8。具有Servlet依賴性的pom.xml

<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/maven-v4_0_0.xsd">  
<modelVersion>4.0.0
</modelVersion>  
<groupId>com.apress.gswmbook
</groupId>  
<artifactId>gswm-web
</artifactId>  
<packaging>war
</packaging>  
<version>1.0-SNAPSHOT
</version>  
<name>gswm-web Maven Webapp
</name>

<url>http://maven.apache.org
</url>  
<dependencies>        
<dependency>  
<groupId>javax.servlet
</groupId>  
<artifactId>javax.servlet-api
</artifactId>  
<version>3.0.1
</version>  
<scope>provided
</scope>
</dependency>    
<dependency>      
<groupId>junit
</groupId>      
<artifactId>junit
</artifactId>      
<version>3.8.1
</version>      
<scope>test
</scope>    
</dependency>  
</dependencies>  
<build>    
<finalName>gswm-web
</finalName>    
<plugins>      
<plugin>        
<groupId>org.apache.tomcat.maven
</groupId>        
<artifactId>tomcat7-maven-plugin
</artifactId>        
<version>2.2
</version>      
</plugin>    
</plugins>  
</build>
</project>
 4.  因爲你將進行Java Web開發,在src / main下創建一個名爲java的文件夾。同樣,在src下創建test / java和test / resources文件夾。

在src / main / java下的com.apress.gswmbook.web.servlet包中創建AppStatusServlet.java文件。包com.apress.gswmbook.web.servlet轉換爲文件夾結構com \ apress \ gswmbook \ web \ servlet。 AppStatusServlet.java的源代碼如清單6-9所示。    
    列表6-9。 AppStatusServlet Java類源代碼

package com.apress.gswmbook.web.servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
@WebServlet("/status")public class AppStatusServlet extends HttpServlet 
{        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException 
{        PrintWriter writer = response.getWriter();
        writer.println("OK");
        response.setStatus(response.SC_OK);
    
}
}
原型項目將類似於圖6-5所示的結構。
圖6-5。生成原型項目
    使用命令行,導航到項目文件夾gswm-web-prototype並運行以下命令:   
mvn archetype:create-from-project
完成命令後,您應該看到消息原型在target / generated-sources / archetype中創建。新創建的原型現在位於gswm-web-prototype / target / generated-sources / archetype下。
    下一步是將新創建的原型移動到單獨的文件夾gswm-web-archetype中,以便在發佈之前對其進行調整。要完成此操作,請按照下列步驟操作:   
      在C:\ apress \ gswm-book \ chapter6文件夾中創建文件夾gswm-web-archetype。
      將C:\ apress \ gswm-book \ chapter6 \ gswm-web-prototype \ target \ generated-sources \ archetype文件夾中的子目錄和文件複製到gswm-web-archetype文件夾。
      從C:\ apress \ gswm-book \ chapter6 \ gswm-web-archetype文件夾中刪除目標子目錄。
    gswm-web-archetype的目錄結構應類似於圖6-6所示。

圖6-6。 Web原型項目結構 
    讓我們使用位於gswm-web-archetype \ src \ main \ resources \ archetype-resources的pom.xml文件開始修改過程。將pom.xml文件中的最終名稱從gswm-web更改爲$ {artifactId}。在項目創建期間,Maven將用用戶提供的artifactId值替換$ {artifactId}表達式。
當從原型創建項目時,Maven提示用戶輸入包名稱。它將在新創建的項目的src / main / java文件夾下創建與軟件包對應的目錄。然後它將原型的archetype-resources / src / main / java文件夾下的所有內容移動到該包中。因爲您想要在子包web.servlet下的AppStatusServlet,創建文件夾web / servlet並將AppStatusServlet.java移動到新創建的文件夾下。 AppStatusServlet.java的新位置如圖6-7所示。

      圖6-7。 AppStatusServlet在web.servlet包下 

    打開AppStatusServlet.java並從package $ {package}中更改包名稱;到包$ {package} .web.servlet ;.
    創建原型的最後一步是在文件夾gswm-web-archetype內的命令行中運行以下命令:  
mvn clean install
    使用原型
安裝原型後,從中創建項目的最簡單方法是在C:\ apress \ gswm-book \ chapter6下運行以下命令:    
mvn archetype:generate -DarchetypeCatalog = local

    爲Maven提示輸入示例6-10中所示的值,您將看到創建了一個測試項目。
    代碼6-10。使用Archetype創建新項目

C:\apress\gswm-book\chapter6>mvn archetype:generate -DarchetypeCatalog=local
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[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: local -> com.apress.gswmbook:gswm-web-archetype (gswm-web-archetype)Choose a number or apply filter (format: 
[groupId:]artifactId, case sensitive contains): : 1Define value for property 'groupId': : com.apress.gswmbookDefine value for property 'artifactId': : test-projectDefine value for property 'version':  1.0-SNAPSHOT: :Define value for property 'package':  com.apress.gswmbook: :Confirm properties configuration:groupId: com.apress.gswmbookartifactId: test-projectversion: 1.0-SNAPSHOTpackage: com.apress.gswmbook Y: :
------------------------------------------------------------------------------project
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:27.635s
[INFO] Finished at: Mon Oct 13 23:36:01 MDT 2014
[INFO] Final Memory: 9M/22M
[INFO] ------------------------------------------------------------------------
因爲test-project的pom.xml文件已經具有嵌入式Tomcat插件,請運行mvn tomcat7:在命令行中的C:\ apress \ gswm-book \ chapter6 \ test-project文件夾下運行以啓動項目 。 打開瀏覽器並導航到http:// localhost:8080 / test-project / status。 將顯示“確定”,如圖6-8所示。

       圖6-8。 輸出生成的測試項目
總結

Maven原型是項目模板,允許您快速引導新項目。 本章使用內置原型生成高級Maven項目,如Web項目和多模塊項目。 您還查看了創建和使用自定義原型。
     在下一章中,您將學習網站生成的基礎知識,並使用Maven創建文檔和報告。

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