设为首页 收藏本站
查看: 846|回复: 0

[经验分享] Tomcat 7之无需JDK只需JRE与无需web.xm及J2SE 6.0之真实与谎言?

[复制链接]

尚未签到

发表于 2017-2-9 09:53:59 | 显示全部楼层 |阅读模式
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 想启动之
cd /d D:\OpenSource\Tomcat\7.0.0-RC4\bin
D:\OpenSource\Tomcat\7.0.0-RC4\bin>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
然后 startup.bat 想启动之
cd /d D:\OpenSource\Tomcat\7.0.0-RC4\bin
D:\OpenSource\Tomcat\7.0.0-RC4\bin>startup.bat
并加上 -verbose 进行跟踪,可以得到如下详细的错误信息

[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.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>
<servlet-name>NoneAnnotationServlet</servlet-name>
<url-pattern>/NoneAnnotationServlet</url-pattern>
</servlet-mapping>
</web-app>

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

http://localhost:8080/Tomcat7/AnnotationServlet
http://localhost:8080/Tomcat7/NoneAnnotationServlet


蒽哪,很和谐的说。Tomcat还有很多新的Servlet 3.0与Java EE 6规范的特性,慢慢测试之。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-339593-1-1.html 上篇帖子: MyEclipse中启动Tomcat,报OutOfMemoryError: PermGen space的解决方法 下篇帖子: form表单提交数据编码方式和tomcat接受数据解码方式的思考
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表