Dynamic Web开发之版本分析

前言:写这篇博客的原因是,我在使用Maven构建一个web模块的时候,其使用的JavaSE1.5环境,在build path配置中改变后,更新Maven项目又变成了1.5,而且EL表达式在JSP中无法解析,这也就是我弄清楚这些问题的初衷。

  我们使用Maven的maven-archetype-webapp创建Web模块,其默认使用的是J2SE-1.5环境,而且Dynamic Web的版本为2.3,我们可以通过如下方式进行查看:项目右击 → 最下面的Properties → Project Facets,如下:

  我们可以查看到<1>的版本为2.3,<2>的版本为1.5,更让人郁闷的是在Java上右击可以Change Version,而Dynamic Web Module却无法更改,并且Java的版本是改了,可是你是用Maven进行update Project,Java的版本又变成了1.5。

  在我们针对这个问题讲述解决方法之前,先对各个版本关系进行整理。

1. Servlet API

  Web项目开发离不开Servlet,Servlet的各版本如下:

Servlet API history
Servlet APIversion Platform Important Changes
Servlet 3.1 Java EE 7 Non-blocking I/O, HTTP protocol upgrade mechanism (WebSocket)
Servlet 3.0 Java EE 6, Java SE 6 Pluggability, Ease of development, Async Servlet, Security, File Uploading
Servlet 2.5 Java EE 5, Java SE 5 Requires Java SE 5, supports annotation
Servlet 2.4 J2EE 1.4, J2SE 1.3 web.xml uses XML Schema
Servlet 2.3 J2EE 1.3, J2SE 1.2 Addition of Filter
Servlet 2.2 J2EE 1.2, J2SE 1.2 Becomes part of J2EE, introduced independent web applications in .war files
Servlet 2.1 Unspecified First official specification, added RequestDispatcher, ServletContext
Servlet 2.0 JDK 1.1 Part of Java Servlet Development Kit 2.0

  我们在开发中都会接触到web.xml文件,其中根元素<web-app>其中的version就是指定的Servlet的版本,其中最主要的分水岭,就是Servlet2.4,因为从这个版本开始web.xml使用XML Schema(关于更多的web.xml头信息的写法可参考web.xml部署描述符),而Maven创建的webapp的Servlet版本是2.3,其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>

  通过后缀可以看出该web.xml指定的Servlet版本是2.3,我们将其改成比较新的版本如3.0或3.1之后,我们更新当前的Maven项目(或模块),会报如下错误:

2. Tomcat与Servlet

Tomcat官网资料:http://tomcat.apache.org/whichversion.html

  Apache Tomcat is an open source software implementation of the Java Servlet and JavaServer Pages technologies. Different versions of Apache Tomcat are available for different versions of the Servlet and JSP specifications. The mapping between the specifications and the respective Apache Tomcat versions is:

  Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,其实现了Java Servlet和JSP技术。不同版本的Tomcat可用于不同版本的servlet和JSP规范。Tomcat版本各版本与这些规范的对应关系,如下:

Servlet Spec JSP Spec EL Spec WebSocket Spec JASPIC Spec Apache Tomcat Version Latest Released Version Supported Java Versions
4.0 TBD (2.4?) TBD (3.1?) TBD (1.2?) 1.1 9.0.x 9.0.0.M19 (alpha) 8 and later
3.1 2.3 3.0 1.1 1.1 8.5.x 8.5.13 7 and later
3.1 2.3 3.0 1.1 N/A 8.0.x (superseded) 8.0.43 (superseded) 7 and later
3.0 2.2 2.2 1.1 N/A 7.0.x 7.0.77 6 and later
(7 and later for WebSocket)
2.5 2.1 2.1 N/A N/A 6.0.x 6.0.51 5 and later
2.4 2.0 N/A N/A N/A 5.5.x (archived) 5.5.36 (archived) 1.4 and later
2.3 1.2 N/A N/A N/A 4.1.x (archived) 4.1.40 (archived) 1.3 and later
2.2 1.1 N/A N/A N/A 3.3.x (archived) 3.3.2 (archived) 1.1 and later

  Each version of Tomcat is supported for any stable Java release that meets the requirements of the final column in the table above.

3. Maven问题解决

<1> 首先就是有一个maven webapp项目。

<2> 当刚创建的时候项目上有个红叉(都是这样,正常),然后右击项目build path,添加jre&tomcat(看缺什么),此时我这边不会报错了。

<3> 打开项目所在文件夹,在.settings文件夹下打开org.eclipse.wst.common.project.facet.core.xml文件,然后修改JDK及Servlet版本。我们在最上面的图中可以看到有三项被勾选上了,分别是Dynamic WebModule、Java和JavaScript,我们在org.eclipse.wst.common.project.facet.core.xml文件文件中可以看到如下内容:

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

  其中有三个version分别对应的就是Dynamic WebModule、Java和JavaScript这三个选项的版本,从大体内容上我们也可以分辨出来,其对应关系如下:

  • jst.web : Servlet
  • wst.jsdt.web : JavaScript
  • java : JDK

<4> 在Maven项目的POM中加入编译器版本,其中指定的版本与上面更改的JDK版本一致,如下:

<build>  
    <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>  
                <encoding>${project.build.sourceEncoding}</encoding>  
            </configuration>  
        </plugin>  
    </plugins>  
</build> 

<5> 修改web.xml的头文件,指定的版本也应该与上面更改的Servlet版本一致,如下:

<?xml version="1.0"?>
<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">  
</web-app> 

<6> 右击项目找到Maven,然后选择Update Project,这样就可以了。

注意:如果你在web.xml文件头中指定的Servlet版本为3.1,而在org.eclipse.wst.common.project.facet.core.xml文件中指定的却是3.0,那么更新Maven项目后保留的是web.xml文件中指定的版本,也就是3.1,而org.eclipse.wst.common.project.facet.core.xml文件中指定版本也会被变更为3.1。同理JDK的版本也是出现这种情况,最终保留的是POM中指定的JDK版本。

  那么问题来了,如果我在POM中指定好JDK版本,然后将web.xml文件头文件改成相应的Servlet版本,而不去更改org.eclipse.wst.common.project.facet.core.xml文件的前提下,更新Maven项目,这样可以直接修改成功吗?

  我使用的Eclipse的版本为:Neon.3 Release (4.6.3),经过测试,答案是不可以,所以我们必须手动修改才可以。有趣的是,我只要手动修改一下org.eclipse.wst.common.project.facet.core.xml文件,指定Servlet的版本在2.5及其以上,更新Maven项目就会将POM与web.xml中的配置信息写入这个文件中。至于为什么,不知道。

参考资料:

赞赏

阅读更多
换一批

没有更多推荐了,返回首页