Maven系列 6.Maven原型

8 篇文章 0 订阅
8 篇文章 0 订阅
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创建文档和报告。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值