maven学习(2):定制一个maven web项目
一.创建一个简单的web项目
maven3.0以上版本已经废弃create,启用generate创建项目
1.执行指令创建项目:mvn archetype:generate -DgroupId=org.zcf -DartifactId=webtest -DpackageName=com.zcf.webtest -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=internal
groupId
d 团体,公司,小组,组织,项目,或者其它团体。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。来自Sonatype 的项目有一个以com.sonatype开头的 groupId ,而Apache Software的项目有以org.apache开头的 groupId
ArtifactID在 groupId 下的表示一个单独项目的唯一标识符。
(maven 骨架生成项目速度慢的令人发指,都在Generating project in Batch mode等待,Idea状态显示栏还在不行runing,并没有卡死。查看debug信息发现,是maven获取archetype-catalog.xml导致。(用游览器打开http://repo1.maven.org/maven2/archetype-catalog.xml,需要等待很长时间才能获取到。)
解决方法:加上-DarchetypeCatalog=internal 运行参数,archetype-catalog.xml本地获取。)
会出现如下界面
生成的目录结构如下:
注意 packaging 元素包含的值是 war 。这种打包类型配置让 Maven 以 WAR 文件的形式生成一个 web 应用。一个打包类型为 war 的项目,将会在 target/ 目录创建一个WAR 文件,这个文件的默认名称是 content-zh-0.6-SNAPSHOT.war 。对于这个项目,默认的 WAR 文件是 target/webtest-1.0-SNAPSHOT.war 。在这个webtest项目中,我们已经通过在项目的构建配置中加入 finalName 元素来自定义这个生成的
WAR 文件的名称。根据 webtest 的 finalName , package 阶段生成的 WAR 文件为 target/webtest.war 。
二.配置jetty插件并运行
在你已经编译,测试并且打包了你的 web 应用之后,你会想要将它部署到一个servlet 容器中,然后测试一下由 Maven Archetype 插件创建的 index.jsp 。通常情况下,你需要下载 Jetty 或者 Apache Tomcat,解压分发包,复制你的应用程序 WAR文件至 webapps/ 目录,然后启动你的容器。 现在,实现同样的目的,你不再需要做这些事情。 取而代之的是,你可以使用 Maven Jetty 插件在 Maven 中运行你的 web应用。为此,你需要在项目的 pom.xml 中配置 Maven Jetty 插件。 在你项目的构建配置中添加如下插件元素:
<plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>maven-jetty-plugin</artifactId> </plugin> </plugins>
在项目的 pom.xml 中 配置好 Maven Jetty 插件之后,你就可以调用 Jetty 插件的Run 目标在 Jetty Servlet 容器中启动你的 web 应用。如下运行 mvn jetty:run :
在浏览器中载入 URL http://localhost:8080/webtest/,会看到helloword界面
三.配置一个简单的servlet
1. 在项目目录下创建 src/main/java/org/zcf的子目录,在子目录下创建一个TestServlet.java文件,插入以下代码
package org.zcf; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println( "SimpleServlet Executed" ); out.flush(); out.close(); } }2. 接着修改src/main/webapp/下的web.xml目录,配置servlet
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name>] <servlet> <servlet-name>test</servlet-name> <servlet-class>org.zcfTestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> </web-app>3.执行编译:mvn compile,会报以下的错误,因为缺少了servlet api的依赖
[ERROR] /C:/Users/Administrator/webtest/src/main/java/org/zcf/TestServlet.java:[ 5,8] 类SimpleServlet是公共的, 应在名为 SimpleServlet.java 的文件中声明 [ERROR] /C:/Users/Administrator/webtest/src/main/java/org/zcf/TestServlet.java:[ 3,1] 程序包javax.servlet不存在 [ERROR] /C:/Users/Administrator/webtest/src/main/java/org/zcf/TestServlet.java:[ 4,1] 程序包javax.servlet.http不存在 [ERROR] /C:/Users/Administrator/webtest/src/main/java/org/zcf/TestServlet.java:[ 5,36] 找不到符号 符号: 类 HttpServlet [ERROR] /C:/Users/Administrator/webtest/src/main/java/org/zcf/TestServlet.java:[ 6,19] 找不到符号 符号: 类 HttpServletRequest 位置: 类 org.sonatype.mavenbook.web.SimpleServlet [ERROR] /C:/Users/Administrator/webtest/src/main/java/org/zcf/TestServlet.java:[ 7,1] 找不到符号 符号: 类 HttpServletResponse 位置: 类 org.sonatype.mavenbook.web.SimpleServlet [ERROR] /C:/Users/Administrator/webtest/src/main/java/org/zcf/TestServlet.java:[ 8,8] 找不到符号 符号: 类 ServletException 位置: 类 org.sonatype.mavenbook.web.SimpleServlet [INFO] 7 errors在pom文件中添加servlet的依赖即可,这里还有必要指出的是我们的这个依赖使用了 provided 范围。这个范围告诉 Maven jar 文件已经由容器“提供”了,因此不再需要包含在 war 中。
<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>3.0-alpha-1</version> <scope>provided</scope> </dependency>http://localhost:8080/webtest/test打开地址可以看到servlet生成的结果