译者的话: 几年前,我为自己设定了一个目标,即快速但紧密地了解Apache Maven这样广泛使用的框架。 几乎立刻,我设法找到了合适的文献,但是所有复杂的资料都只用英语,而俄语却散布了很多文章,但令我感到有些惊讶,但我找不到能从头到尾阅读的完整书籍。成功了。 因此,为了阅读,我选择了一本书,由Balaji Varnasi和Sudha Belida撰写,并由Apress于2014年出版,介绍了Maven。 解决了所有任务后,我逐渐产生了该出版物的译文,尽管该出版物已经摆放在我的办公桌上了两年之久,但对社区仍然可能有用。
在这里,我仅翻译了本书的其中一章,但可以在此处从这些链接中以英语或俄语 (PDF)下载全文。
第6章:Maven原型
至此,您已经手动创建了Maven项目,从头开始创建文件夹和
pom.xml文件。 这可能很乏味,特别是如果您经常必须创建项目时。 为了解决这个问题,Maven提供了原型。
Maven原型是预定义的项目,使用户可以轻松创建新项目。
Maven原型还为共享经验提供了方便的基础,并确保了标准Maven目录结构的一致性。 例如,企业可以使用企业级联样式表(
CSS ),
JavaScript批准的库和可重用组件来创建原型。 使用这些原型创建项目的开发人员将自动遵循公司标准。
内置原型
开箱即用,Maven为开发人员提供了数百种原型。 此外,有许多开源项目提供了可以下载和使用的其他原型。 Maven还提供具有目标的插件原型,以创建原型并从原型生成项目。
原型插件有一个
生成目标,可让您查看和选择所需的原型。
清单6-1显示了从命令行运行generate target的结果。 如您所见,已提供491个原型供您选择
(到2018年,已经有超过2,000种翻译形式) 。 本章将讨论其中几个的用法。
清单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): 491:
Web项目创建
Maven提供了
maven-archetype-webapp原型来生成Web应用程序。 让我们通过在
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显示了修改后的
pom.xml文件,其中添加了
Tomcat插件。
清单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 startInternal INFO: Starting service Tomcat Oct 11, 2014 12:08:43 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.47 Oct 11, 2014 12:08:45 PM org.apache.catalina.util.SessionIdGenerator createSecureRandom INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [334] milliseconds. Oct 11, 2014 12:08:45 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-bio-8080"]
现在启动浏览器并转到
localhost :8080 / gswm-web / 。 您应该看到一个
如图6-2所示的网页。
图6-2。 在浏览器中运行的Web项目
多模块项目
Java Enterpise Edition(JEE)项目通常分为几个模块,以方便开发和维护。 这些模块中的每个模块都会产生工件,例如
Enterprise JavaBean(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中运行以下命令来创建一个Web项目
:\ apress \ gswm-book \ Chapter6 \ gswm-parent文件夹 :
mvn archetype:generate -DgroupId=com.apress.gswmbook -DartifactId=gswm-web -Dversion=1.0.0-SNAPSHOT -Dpackage=war -DarchetypeArtifactId=maven-archetype-webapp
在生成该Web项目的过程中,您为Maven提供了诸如
groupId ,
version等坐标,作为传递给生成目标的参数,该对象创建了
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
请注意,您没有指定
package参数,因为
maven-archetype-quickstart创建一个默认的
JAR项目。 还要注意对
InteractiveMode参数的使用。 它只是告诉Maven执行命令,而不提示用户任何信息。
与上一步类似,通过在
C中执行以下命令来创建以下
gswm库 Java项目
:\ apress \ gswm-book \ Chapter6 \ gswm-parent文件夹 :
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显示了其内容。
清单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.xml的信息。
清单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兼容,并包含一个
状态Servlet ,该
状态Servlet返回HTTP状态代码200(“ OK”-成功请求)。 复制以前生成的
gswm-web项目并在
C:\ apress \ gswm-book \ Chapter6文件夹中创建
gswm-web-prototype ,而不是从头开始创建Web项目。 对您刚刚复制的项目进行以下更改:
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文件中。
清单6-8显示了更新的
pom.xml内容。
清单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文件夹。
5.在
src / main / java目录中创建属于
com.apress.gswmbook.web.servlet包的
AppStatusServlet.java文件。 包
com.apress.gswmbook.web.servlet转换为文件夹结构
com \ apress \ gswmbook \ web \ servlet 。
清单6-9显示了
AppStatusServelet.java文件的源代码。
清单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
在命令末尾,您将看到
在目标/ generate-sources / archetype中创建的
Archetype消息。 生成的原型位于
gswm-web-prototype / target / generated-sources / archetype文件夹中。
下一步是将新生成的工件转移到单独的gswm-web-archetype文件夹中,以便在发布前对其进行配置。 为此,请按照下列步骤操作:
1.在
C:\ apress \ gswm-book \ Chapter6目录中创建
gswm-web-archetype文件夹。
2.将子目录和文件从
C:\ apress \ gswm-book \ chapter6 \ gswm-web-prototype \ target \ generated-sources \ archetype文件夹复制到
gswm-web-archetype文件夹。
3.从
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中的
finalName从
gswm-web更改为$ {artifactId}。 在项目创建过程中,Maven将用用户提供
的值替换表达式
$ {artifactId} 。
从原型创建项目时,Maven会要求用户提供程序包名称。 Maven创建一个文件夹结构,该结构与位于所创建项目的
src / main / java目录中的包相对应。 然后,Maven将所有内容从
archetype-resources / src / main / java archetype文件夹移至该包中。 因为 如果您希望
AppStatusServlet位于
web.servlet子包中 ,请创建
web / servlet文件夹并将
AppStatusServlet移至其中。
AppStatusServlet.java的新位置
如图6-7所示。
图6-7。 web.servlet包中的AppStatusServlet
打开
AppStatusServlet.java并从
包$ {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 使用原型创建新项目 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): : 1 Define value for property 'groupId': : com.apress.gswmbook Define value for property 'artifactId': : test-project Define value for property 'version': 1.0-SNAPSHOT: : Define value for property 'package': com.apress.gswmbook: : Confirm properties configuration: groupId: com.apress.gswmbook artifactId: test-project version: 1.0-SNAPSHOT package: 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] ------------------------------------------------------------------------
因为
测试项目的
pom.xml文件已经包含
Tomcat插件,然后在
C:\ apress \ gswmbook \ Chapter6 \ test-project文件夹中运行
mvn tomcat7:run命令以启动
项目 。 打开浏览器,然后转到
localhost :8080 / test-project / status 。 您将看到铭文
OK ,
如图6-8所示。
图6-8。 生成的项目生成的页面
总结
Maven原型是项目存根,可让您快速启动新项目。 在本章中,使用内置原型来生成复杂的Maven项目,例如Web项目或多模块项目。 您还学习了如何创建和使用自定义原型。
在下一章中,您将学习使用Maven进行网站生成,文档编制和报告的基础知识。