天天看点

Tomcat 7之无需JDK只需JRE与无需web.xm及J2SE 6.0之真实与谎言?

当然首先是确定一下,是真实的,吃个定心丸先,不是谎言:) 

下载了tomcat 7 rc4,解压到 d:/opensource/tomcat/7.0.0-rc4 目录下后 

先将 java_home 变量清除,如果你原先有设置 java_home 变量的话,免得产生干扰 

在命令行下,先取消 java_home 变量 

set java_home= 

然后设置 jre_home 变量 

set jre_home=d:/jre/1.6.0 

再启动,就可以顺利开启了。。。。 

cd /d d:/opensource/tomcat/7.0.0-rc4/bin 

d:/opensource/tomcat/7.0.0-rc4/bin>startup.bat 

当然,也可以顺利地停止 

d:/opensource/tomcat/7.0.0-rc4/bin>shutdown.bat 

对于习惯性设置 java_home 变量的开发者来说,如果仅是将它改为 jre 所在的路径,想来试试,就会报错。 

set java_home=d:/jre/1.6.0 

然后 startup.bat 想启动之 

嘿嘿,启不来了,呵呵,报告 java_home 变量设置不对,应当指向jdk,而不是直接指向 jre 路径了事 

the java_home environment variable is not defined correctly 

this environment variable is needed to run this program 

nb: java_home should point to a jdk not a jre 

可能会有疑问,不是明明文档里说只需要jre 6.0的吗? 

apache tomcat 7.0 requires the java 2 standard edition runtime environment (jre) version 6.0 or later. 

但是,正如前面设置 jre_home 变量所说的,不信,再翻开文档去看一下,里面说得很清楚是设置 jre_home 变量,当然去看 setclasspath.bat 的脚本的具体内容可能更加能够了解清楚它 

set an environment variable named jre_home to the pathname of the directory into which you installed the jre 

如果直接将 jre 路径当作 java_home,那则是习惯惹得错了,呵呵。不过话说回来,仅是配置 jre_home 的情况比较少;都是设置过 java_home 变量,然后 jre_home 自己挂之,然后 path 里加上个 .;%java_home%/bin 之类的。。。 

真实谎言,其实自从 tomcat 5.5 开始,都说明只需要 jre 就可以运行了。只不过 tomcat 5.0 时候还是需要 jdk 1.3 才可以运行的。 

由于tomcat 7必须是j2se 6以上版本才可以运行,那就试一下j2se 5,看会有什么情况 

set java_home=d:/jre/1.5.0 

并加上 -verbose 进行跟踪,可以得到如下详细的错误信息 

java代码 

[loaded java.io.ioexception from shared objects file]  

exception in thread "main" java.lang.unsupportedclassversionerror: bad version number in .class file  

        at java.lang.classloader.defineclass1(native method)  

        at java.lang.classloader.defineclass(unknown source)  

        at java.security.secureclassloader.defineclass(unknown source)  

        at java.net.urlclassloader.defineclass(unknown source)  

        at java.net.urlclassloader.access$100(unknown source)  

        at java.net.urlclassloader$1.run(unknown source)  

        at java.security.accesscontroller.doprivileged(native method)  

        at java.net.urlclassloader.findclass(unknown source)  

        at java.lang.classloader.loadclass(unknown source)  

        at sun.misc.launcher$appclassloader.loadclass(unknown source)  

        at java.lang.classloader.loadclassinternal(unknown source)  

[loaded java.lang.shutdown from shared objects file]  

[loaded java.lang.shutdown$lock from shared objects file]  

实际上,启动脚本先会认 java_home 变量,在找到 java_home 的情况下,会将 java_home 赋值给 jre_home,如果有定义 jre_home 变量的话,则 jre_home 变量是最优先的,比如,你定义 

java_home=d:/jdk/1.6.0  

jre_home=d:/jre/1.5.0  

是运行不起来的。 

其实从tomcat 5.5开始就不通过jdk去编译jsp了,而是通过eclipse jdt java编译器来编译jsp文件。 

为了后面的试验方便,首先配置个管理用户,编辑 conf/tomcat-users.xml 配置文件, 

由于tomcat 7重新定义了四个不同的角色来管理应用程序,而不是原来单一个manager角色,为此增加了角色为manager-gui的gui_admin用户,密码password 

<role rolename="manager-gui"/>  

<user username="gui_admin" password="password" roles="manager-gui"/>  

为此,你需要设置不同的角色处理不同的管理内容,具体如下: 

manager-gui - allows access to the html gui and the status pages 

manager-script - allows access to the text interface and the status pages 

manager-jmx - allows access to the jmx proxy and the status pages 

manager-status - allows access to the status pages only 

这样gui_admin可以访问进行管理 

http://localhost:8080/manager/status  

http://localhost:8080/manager/html  

测试一下无需web.xml配置文件来创建一个web应用程序项目 tomcat7 

通过注解编写一个servlet,名为 annotationservlet.java 

@webservlet("/annotationservlet")  

public class annotationservlet extends httpservlet   

{  

    protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception,ioexception   

    {  

        printwriter out = response.getwriter();  

        out.println("annotation servlet in tomcat 7");  

        }  

    }  

}  

如果你用jdk 1.5来编译则会出错 

javac -cp d:/opensource/tomcat/7.0.0-rc4/lib/servlet-api.jar *.java  

annotationservlet.java:4: 无法访问 javax.servlet.servletexception  

错误的类文件: d:/opensource/tomcat/7.0.0-rc4/lib/servlet-api.jar(javax/servlet/servletexception.class)  

类文件具有错误的版本 50.0,应为 49.0  

请删除该文件或确保该文件位于正确的类路径子目录中。  

import javax.servlet.servletexception;  

                     ^  

1 错误  

用1.6编译后,直接部署,启动,整个项目就一个 annotationservlet.class,启动后照样访问 

http://localhost:8080/tomcat7/annotationservlet  

当然一个web项目,少了web.xml文件估计也是玩不转的,试一下通过注解与没有注解的servlet共同工作的场景,创建一个noneannotationservlet.java 

并在web.xml里配置之 

<?xml version="1.0" encoding="utf-8"?>  

<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>web application tomcat 7 servlet 3.0 jsp 2.2</display-name>  

    <description>web application tomcat 7 servlet 3.0 jsp 2.2</description>  

    <servlet>  

        <servlet-name>noneannotationservlet</servlet-name>  

        <servlet-class>noneannotationservlet</servlet-class>  

    </servlet>  

    <servlet-mapping>  

        <url-pattern>/noneannotationservlet</url-pattern>  

    </servlet-mapping>  

</web-app>  

编译、部署后,都可以正常工作。 

http://localhost:8080/tomcat7/noneannotationservlet  

蒽哪,很和谐的说。tomcat还有很多新的servlet 3.0与java ee 6规范的特性,慢慢测试之。

继续阅读