[原创]在weblogic中部署servlet_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3030 | 回复: 0   主题: [原创]在weblogic中部署servlet        下一篇 
shun.zhang
注册用户
等级:上士
经验:305
发帖:14
精华:0
注册:1970-1-1
状态:离线
发送短消息息给shun.zhang 加好友    发送短消息息给shun.zhang 发消息
发表于: IP:您无权察看 2014-7-9 16:05:54 | [全部帖] [楼主帖] 楼主

我们知道,weblogic的工程比tomcat强大得多,用惯了tomcat,想从实际应用上比较一下二者的差别,于是决定先部署一个Servlet应用程序。

从服务器上下载weblogic应用程序,为了方便学习。决定使用比较老的版本,原因如下:

1. 程序较小,下载方便,等待时间较少

2. 早起的应用程序扩展功能可能较少,实际功能较新版本比较单一

3. 实际应用部署的多,可以查阅的资料比较多

在这里我使用的是weblogic8.1.6。在windows下按照向导顺利创建域mydomain

接下来就是将该应用部署web应用程序中去。这里选用的集成开发环境是myeclipse。用myelipse关联weblogic,配置参数。由于配置域的时候忘记了账号和密码,这里先随便填一个,看它待会怎么报错!

按照常用的servlet的开发方式,在这里做一个简单的servlet的小程序。Servletweb.xml中的配置如下:

北京联动北方科技有限公司

HelloWorldServlet实现的功能是,当用户以get/post方式访问时,返回能够区分的话语,并在myeclipse中打印使用get/post哪个方法处理的此操作。部署,启动服务器。

不出意外,他果然报错了!详细信息大致如下:

The WebLogic Server did not start up properly.
java.io.InvalidClassException: javax.management.MBeanAttributeInfo; local class incompatible: stream classdesc serialVersionUID = 7043855487133450673, local class serialVersionUID = 8644704819898565848
at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
at java.io.ObjectInputStream.readClassDesc(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readArray(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
……


什么意思?由于流的序列化原因造成本地类不兼容,以至于找到的类不能使用。它怎么不是weblogic的账号和密码不匹配啊?经过查找的资料和验证,据说是jre的版本太高了,换成weblogic自带的jre就行了。jre的版本太高了?不是都可以向下兼容的吗?难道是weblogic的自带的jre中的包与系统的jre包有什么不同(weblogic自己添加了新的包)?先不管照着做就行了。重新启动服务器,不出意外他又报错了!这次的是weblogic.security.SecurityInitializationException: Authentication denied: Boot identity not valid; The user name and/or password from the boot identity file (boot.properties) is not valid. 

……

好的,这次是账号和密码问题,意料之中嘛。怎么办?删掉这个域,再重新创建?还是看能不能冲配置文件中找到用户名和密码。查看配置文件,大致在这个地方

北京联动北方科技有限公司

好像被加密了,不做死就��会死。找资料发现,可以如下这般……

1. cd到你的域目录(domain home

2.运行java -cp <weblogic_home>\weblogic81\server\lib\weblogic.jar weblogic.security.utils.AdminAccount adminuser adminpassword .

参数第一个adminuser是你增加一个新用户的用户名��第二个参数adminpassword是该新用户的密码;第三个参数(一个.)是指当前目录(域目录)

注意:千万不要忘了第三个参数“.,这不是句末结尾的英文句号!

3.删掉myserver/ldap/DefaultAuthenticatormyrealmInit.initialized 

4.删掉 boot.properties   (如果有的话)

5.重启server

恭喜,这次它又异常了,还有完没完?

这次的异常大概是这样的:Deployment descriptor "web.xml" is malformed. Check against the DTD: org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'web-app'.“你的web.xml是畸形的,……你的dtd有问题。”怎么可能?创建web项目之后不是都有web.xml文件吗,并且从来没有出现过问题?并且在工作空间下还能够看到这个文件没有出现警告或者红叉啊!你出毛病了吧?再找找吧……

这次的情况是这样的,每一个xml文件如果有<!DOCTYPE……就表示他是要符合某一个规范的,这个约束文件可以是scheme也可以使DTD,一般它会在本地找,然后才通过联网校验。在这里这个校验没有通过,所以他不承认这个web.xml

解决方法:不能用以前这xml配置了

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app> 这种格式,需要换成:
<?xml version="1.0" encoding="UTF-8"?>
<!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>
</web-app>


好吧,你狠,你的地盘你做主吧!继续重启服务器。有惊无险,��个世界清静了。终于没有报错了。应该能运行了吧?

访问:

错误代码 500,控制台报错:北京联动北方科技有限公司,

java.lang.UnsupportedClassVersionError: HelloWorldServlet (Unsupported major.minor version 49.0).
at weblogic.servlet.internal.ServletStubImpl.prepareServlet(ServletStubImpl.java:905)
……
Was not found in the classpath D:\zhwls816\user_projects\domains\mydomain\applications\HelloWorld\WEB-INF\classes
……


你不能这样欺负人啊!这又是什么?还是找不到?打开weblogic的应用目录,明明有那个文件,你瞎了?

管他呢,先试试index.jsp能否显示,结果又能正常访问,怎么回事?

原因:出现java.lang.UnsupportedClassVersionError 错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误。 
因为,高版本的JDK生成的class文件使用的格式,可能与低版本的JDK.class文件格式不同。这样,低版本的JVM无法解释执行这个.class文件,会抛出java.lang.UnsupportedClassVersionError不支持的Class版本错误。这个错误尤其在JDK5JDK5之前的版本上表现明显。因为,JDK5Java语法上作了不少增强,引入了一些新的.class文件的元素,导致旧版本的JVM无法解释、执行.class文件。即使这个类并没有使用任何JDK5的新元素,但是JDK5生成的.class文件,JDK1.4及其以前的JVM都无法辨认!

由于index.jsp的文件在weblogicjsp解析引擎中转成的.class文件,使用的是weblogicjdk,所以又能够访问其中的jsp文件。难道就全部使用jsp文件?这不可能!

好吧,既然这样,最好的解决方法莫过于下载新版本的weblogic应用程序。这可能要花费一段时间,既然这样,能不能试试其他的解决方法。降低应用程序的编译环境。注意是编译环境不是执行环境。

北京联动北方科技有限公司

再次重启服务器,程序照样正常运行。访问北京联动北方科技有限公司等待……

OK!


至此,servlet算是在weblogic上运行起来了。

现在总结出现问题的原因:

1.思维没有转变过来,在servlet方面。虽然tomcatweblogic都按照j2ee规范实现了servlet,但是二者在实现上还是有差别的。

2.Weblogic和开发环境的工程项目都有一个jre。在加载文件.java,.jsp文件的时候,工程项目中的jre负责将.java编译成可以被weblogic执行的.class文件。当请求过来的时候,如果需要,weblogic会加载此class文件,考虑到一般程序的向下兼容,因此,项目中使用的jre环境应该小于或等于weblogic的使用环境,jdk1.4jdk5的差距应该被特别注意。当然,项目中用于编译.java文件的jre的编译水平低于weblogic也是可以的。该jre几乎不负责项目的运行,因此,这种情况下,运行环境(使用版本)无需太在意。

3.从这些错误报告中大致可以看出,用weblogic部署servlet应用程序时的一般执行流程大致是这样的:weblogic绑定jre启动服务——>加载weblogic的配置文件config.xml,同时审计myeclipse中配置的weblogic的域的信息——>如果通过,加载web项目中的web.xml文件,并检查该文件是否符合标准——>按照web.xml中配置的监听器,过滤器,servlet等加载并由项目中的jre编译对应.java文件,当用户请求时,weblogic先监听请求,如果是以一个请求,加载.class文件,在执行对应的servlet服务……




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论