`
frank-liu
  • 浏览: 1681473 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一种maven改造快速支持servlet3.1web工程的方法

 
阅读更多

问题的引出

    平时在工作中大量的开发都依赖于工具maven,而且这个工具总的来说功能还是非常强大的。由于在最近的一些web开发中要用到最新的servlet3.1以及最新的web container tomcat 8,于是想利用maven原生的archetype类型来构建项目。可惜尝试使用默认的类型之后发现它并不提供最新版本的支持。而如果要将原来的工程改造成支持servlet 3.1 web工程的话,还是很麻烦。于是想找个好点的办法,能够尽量高效的生成这样的工程。

    为了完整的记录和对比两种方法,这里主要列举了一种是针对原有maven web-app工程进行改造的方法,还有一种是利用一个自定义的maven archetype工程进行改造的方法。

 

原有方法

      假如我们需要创建一个maven web工程,一种方法是使用IDE里自带的功能来创建一个,然后一步步的配置,还要一个方法就是使用maven命令行。比如我们输入如下的命令:

 

mvn archetype:generate -DgroupId=com.yunzero -DartifactId=MavenDefaultProject -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

    这个时候,我们将生成一个名字为MavenDefaultProject的web工程。上述命令的输出如下:

 

[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) > generate-sources @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:2.2:generate (default-cli) < generate-sources @ standalone-pom <<<
[INFO] 
[INFO] --- maven-archetype-plugin:2.2:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Batch mode
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: basedir, Value: /home/frank/programcode/maven
[INFO] Parameter: package, Value: com.yunzero
[INFO] Parameter: groupId, Value: com.yunzero
[INFO] Parameter: artifactId, Value: MavenDefaultProject
[INFO] Parameter: packageName, Value: com.yunzero
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] project created from Old (1.x) Archetype in dir: /home/frank/programcode/maven/MavenDefaultProject
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 15.339 s
[INFO] Finished at: 2015-06-21T21:12:47+08:00
[INFO] Final Memory: 15M/303M

    而这个时候如果我们用IDE工具比如ecilpse直接去导入的话,还是不能成功的,因为我们还需要做一步转换。执行命令: 

 

mvn eclipse:eclipse

    这个时候再使用eclipse导入到工程中,我们将看到一个如下的工程结构:

 

    我们再来看对应的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.yunzero</groupId>
  <artifactId>MavenDefaultProject</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>MavenDefaultProject 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>MavenDefaultProject</finalName>
  </build>
</project>

     从文件里可以看到,它和我们期望的工程还是有一些差别的。比如说,我们希望指定的工程里有对servlet 3.1的依赖。可是这里没有,另外,也没有指定我们期望的java执行版本。还要一个问题就是,我们希望它们像一些默认的工程一样,给我们生成一个java代码的包以及测试代码包还要对应配置文件的resources目录。

    所以,要改造成一个期望的工程,我们就需要一步一步的来改造这些项。

 

将目标工程改造成maven工程

    首先选择该工程,点击右键,选择Config->Convert to Maven Project。这个时候,我们将看到工程才真正成为一个maven工程。不过这个时候系统会有一个如下的错误:

 

    解决这个问题很简单,在pom.xml里添加对servlet的依赖:

 

<dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>

    如果这个时候,我们编译和运行工程,将看到一个正常运行的结果:

    可惜这个工程仅仅默认支持servlet 2.3。我们可以打开src/main/webapp/WEB-INF/web.xml文件,它的内容如下:

 

<!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>
</web-app>

   如果要升级到servlet 3.1,这里必然是一个需要修改的地方。另外,如果我们去查看工程的Facets:

 

   很明显,这里显示的也是2.3, java版本支持是1.5。

 

升级

    现在如果我们直接在刚才project Facets里去修改的话,发现这部分的修改都无法保存。很无奈,这个时候,我们需要做一些人工的修改。在该工程所在目录下面,有一个.settings的目录,它是一个隐藏目录,其主要包含的内容如下:

 

 

    我们打开里面的文件org.eclipse.wst.common.project.facet.core.xml,发现它的内容如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
  <fixed facet="wst.jsdt.web"/>
  <installed facet="java" version="1.5"/>
  <installed facet="jst.web" version="2.3"/>
  <installed facet="wst.jsdt.web" version="1.0"/>
</faceted-project>

   很显然,它里面的内容正好就是我们需要设定的内容,我们将jst.web部分的version内容设置为3.1,而java的version内容设置为1.8。这个时候刷新工程,将看到如下的变化。

 

   改了这么多了,居然还有不少问题,再一个个的改过来。首先在pom.xml里添加如下部分来设定支持的java版本:

<build>
    <finalName>MavenDefaultProject</finalName>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
  </build>

  修改完之后更新一下工程,将发现关于java compiler的问题已经解决了。现在,需要修改的下一个文件就是web.xml,将它的内容修改为如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

  <display-name>Archetype Created Web Application</display-name>
    
</web-app>

    之所以这个文件的修改能够解决前面那个问题是因为从servlet 3以来所有的web.xml文件的定义支持的命名空间由原来的dtd格式改为xmlns的样式了。这个时候,我们再尝试运行这个工程,发现它能够正常的运行了,而且支持的版本个已经是servlet 3.1了。

    现在还要一个小的问题就是,如果我们需要添加代码的话,在IDE里通过添加source folder到src/main下面是不行的,还需要手工到工程所在目录下面创建目录,然后刷新工程。

    最终,通过这种方式修改了很多文件和配置,才生成一个我们期望的工程模板。老实说,就为了弄一个这样的工程模板,居然要费这么大的劲,实在是太不值得了。那么有没有更加高效的方法呢?

 

资源的引入

    带着这个问题,在网上搜索了一会儿之后,发现了一个已经有人实现了的工程模板。目前这个工程已经支持servlet 3.0了。它的思路是定义一个类似于maven web-app的archetype,这样每次我们使用它们的时候,这些配置和文件就已经生成好了。

    这个servlet 3的模板生成方法及使用描述如下链接: http://maciejwalkowiak.github.io/servlet3-maven-archetype/

    工程的源代码在github上:https://github.com/maciejwalkowiak/servlet3-maven-archetype.git

    它的使用在链接里,这里就不再赘述了。因为这个工程是一个maven archetype工程。而maven archetype从本质上来说是什么呢?它相当于是一个针对某种类型工程提供的模板,比如对quickstart类型的工程定义为普通工程类库,然后提供对应的java, test目录,然后提供默认的单元测试库引用junit等等。那么按照这个思路,我们这个工程模板里应该有servlet 3.1 api、junit的库引用,以及对应的web.xml配置文件和对应的源代码结构,包括src/main/java, src/main/resources, src/test/java, src/test/resources。于是,我们所要做的事情就是对这个工程的改造。

 

改造

    在改造前,我们先看看原来这个工程的结构:

 

     这个工程里我们实际上需要修改的在archetype-resources里面。在这个目录下的pom.xml文件就是我们最后生成的工程里的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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>${groupId}</groupId>
    <artifactId>${artifactId}</artifactId>
    <packaging>war</packaging>
    <version>${version}</version>
    <name>Servlet 3 Web Application</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java-version>1.6</java-version>
    </properties>

    <dependencies>
        <!-- Servlet 3.0 API -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- test dependencies -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>${java-version}</source>
                    <target>${java-version}</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.0</version>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

    这里的内容比较多,无非就是定义了支持的java版本,依赖的servlet api, junit版本等等。里面的plugin tomcat7-maven-plugin因为目前没有最新官方对tomcat8的支持,可以暂时去掉。我们针对支持的版本等信息也做一个修改,这样修改后的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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>${groupId}</groupId>
    <artifactId>${artifactId}</artifactId>
    <packaging>war</packaging>
    <version>${version}</version>
    <name>Servlet 3 Web Application</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java-version>1.8</java-version>
    </properties>

    <dependencies>
        <!-- Servlet 3.1 API -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- test dependencies -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <finalName>${project.artifactId}-${project.version}</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java-version}</source>
                    <target>${java-version}</target>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
					<warSourceDirectory>src/main/webapp</warSourceDirectory>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

   剩下来需要修改的就是我们添加对应的文件和目录结构。修改之后的目录结构如下:

   详细的改动比较可以参考后面的附件。现在我们再按照文中描述的过程将该工程打包:

 

mvn clean install

   我们再来创建一个利用这个新archetype的工程:

 

mvn archetype:generate -DarchetypeGroupId=pl.maciejwalkowiak -DarchetypeArtifactId=servlet3-webapp-archetype -DarchetypeVersion=1.0.1 -DgroupId=com.yunzero -DartifactId=MavenDefaultProject -DinteractiveMode=false

 

   我们将执行完之后创建的工程转化为eclipse工程:

 

mvn eclipse:eclipse

    然后再用eclipse导入进来:

 

 

    这个时候,我们如果再运行工程,会发现正常的输出页面。这样,整个工程的改造就完成了。

 

总结

    maven的archetype其实就是一个工程结构模板,如果我们需要定制一个需要的模板的话,可以自己按照固定的格式来添加需要的文件和目录。这里包括有pom.xml文件,里面的依赖关系等。通过这么一个小的改动就可以让我们快速的创建一个支持servlet 3.1的web工程了。在maven提供最新的支持servlet 3.1的archetype之前,这也算是一种临时的办法吧。其实看透了它的本质后,自己做一个也可以,不一定非要等到官方出来不可,万一人家就是不出来,逗你呢?

 

参考材料

http://maciejwalkowiak.github.io/servlet3-maven-archetype 

  • 大小: 25 KB
  • 大小: 26.3 KB
  • 大小: 19 KB
  • 大小: 169 KB
  • 大小: 25.2 KB
  • 大小: 38.7 KB
  • 大小: 31.3 KB
  • 大小: 42.2 KB
  • 大小: 40.3 KB
分享到:
评论
2 楼 frank-liu 2016-09-04  
KeatsLee 写道
你的倒数第二张图是怎么生成的啊?

命令??

什么命令展示这种层级呢

linux里面的命令tree,可以显示当前目录下所有目录的树形结构。
1 楼 KeatsLee 2016-09-04  
你的倒数第二张图是怎么生成的啊?

命令??

什么命令展示这种层级呢

相关推荐

    spring mvc3.2.7+servlet3.1(jetty)+maven3+eclipse

    在构建Web应用程序时,"spring mvc3.2.7 + servlet3.1(jetty) + maven3 + eclipse"的组合提供了一种高效且灵活的开发环境。这个配置涉及了多个关键组件,它们共同作用于项目的搭建、管理和运行。 **Spring MVC ...

    jsp-api.jar(2.3)与servlet-api.jar (3.1)

    2. **WebSocket支持**:Servlet 3.1为WebSocket提供了一种标准的集成方式,使得服务器和客户端可以进行双向通信,适用于实时交互的应用场景。 3. **微容器**:Servlet 3.1引入了微容器概念,允许在没有完整应用...

    如何在eclipse jee中创建Maven project并且转换为Dynamic web project

    Maven是一种强大的项目管理工具,而Dynamic Web Project则是Eclipse中的一个特殊项目类型,专用于Web应用的开发。接下来,我们将详细阐述这个过程。 首先,确保你已经安装了Eclipse JEE版本,例如这里的`eclipse-...

    servlet3-webapp-archetype.zip

    【描述】"webapp3.1项目模板的原型" 指出,此压缩包提供的是一种基础架构,适用于那些遵循Web应用程序3.1版本(Java EE 6的一部分)规范的项目。这个原型包括了必要的配置文件和目录结构,让开发者可以迅速启动一个...

    maven+tomcat

    总结起来,"maven+tomcat"的组合是Java Web开发中的常见配置,Maven提供了一种标准化的构建方式,而Tomcat作为应用服务器,负责运行和管理Java Web应用。理解并熟练掌握这两者对于Java开发者来说至关重要。

    spring3.1MVC+mybatis3.1框架集成及事务,分页使用

    6. **JSON**:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,适合于前后端之间的数据传输。Spring MVC可以通过Gson或Jackson库将Java对象转换为JSON字符串,然后通过HTTP响应返回给客户端。在...

    Maven权威指南

    Maven是由Apache组织开发的一个项目管理工具,旨在通过一套标准流程来简化项目的构建过程,提供了一种项目信息管理和构建的方法论。Maven不仅能够帮助开发者构建Java项目,还能用于构建其他类型的项目。 **1.2 公约...

    JavaEE7_WebApplicationLearn_20200620.zip

    通过这个项目,开发者可以学习如何使用JavaEE7、Servlet 3.1和Maven来创建一个基本的Web应用,特别是如何处理文件上传这一重要功能。同时,这也是熟悉现代Java Web开发流程和工具的一个良好实践案例。

    maven配置文档

    Ant是一种基于XML的脚本语言,更适合于编写定制化的构建脚本;而Maven则更侧重于项目的标准化管理。 **1.7 Maven与Ant的比较** - **可读性和易用性**:Maven通过约定减少配置,使POM文件更加简洁明了。 - **依赖...

    正在研究servlet3的朋友们,有谁需要servlet3 api(英文版)的吗, 见附件

    Servlet3.1引入了WebSocket API,提供了一种低延迟、双向通信的机制,用于创建实时Web应用。 7. **JNDI查找支持**: 可以直接在Servlet或Filter中使用@Resource注解进行JNDI查找,获取DataSource或其他服务,简化...

    gradle-springmvc

    Spring MVC 是 Spring 框架的一部分,专门用于构建 Web 应用程序,它提供了一种模型-视图-控制器(MVC)架构模式,帮助开发者有效地组织和管理应用程序的各个组件。Gradle 是一个强大的、灵活的构建自动化系统,可以...

    Maven权威指南 很精典的学习教程,比ANT更好用

    Maven是Ant的另一种选择么? 1.7. 比较Maven和Ant 1.8. 总结 2. 安装和运行Maven 2.1. 验证你的Java安装 2.2. 下载Maven 2.3. 安装Maven 2.3.1. 在Mac OSX上安装Maven 2.3.2. 在Microsoft Windows上安装...

    spring 3.1使用手册

    - **Web**:为基于Servlet的Web应用提供了全面的支持,包括MVC框架、远程访问、事务管理和安全等。 - **面向切面编程(AOP)和工具**:提供了强大的面向切面编程能力,允许开发者定义切面来封装横切关注点。 - **...

Global site tag (gtag.js) - Google Analytics