Balaji Varnasi和Sudha Belida的Maven简介(翻译)

译者的话: 几年前,我为自己设定了一个目标,即快速但紧密地了解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服务器(例如TomcatJetty)简化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提供了诸如groupIdversion等坐标,作为传递给生成目标的参数,该对象创建了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 / javatest / 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中finalNamegswm-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进行网站生成,文档编制和报告的基础知识。

Source: https://habr.com/ru/post/zh-CN421323/


All Articles