java 程序 Exception starting filter struts2异常解决

错误信息 严重: Exception starting filter struts2

错误:

javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found

参考:http://hpfgc.blog.163.com/blog/static/14799557200851711309391/

今天下载了一个struts例子,遇到一个问题就是该网站不能被访问,分两步把这个问题人解决啦!!!

报的错误:

StandardContext[/struts2-mailreader-2.0.11.1]Exception starting filter Struts2

javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found

at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)

第一步:

去看tomcat的webapps,里边也部署上了。去看Tomcat 5.0\logs下的日志,显示javax.xml.transform.TransformerFactoryConfigurationError Provider org.apache.xalan.processor.TransformerFactoryImpl not found

后来上网搜了一下:找到了一篇文章,说该问题是由于tomcat 里Tomcat 5.0\common\endorsed下的两个有关xml的jar文件和JDK里的xml解析器冲突造成的:原文如下:

http://localhost:8080/testdwr/dwr 访问

页面出现错误

javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found

javax.xml.transform.TransformerFactory.newInstance(Unknown Source)

uk.ltd.getahead.dwr.convert.DOMConverter.<init>(DOMConverter.java:157)

这是一个 XML 解析器的问题,我们能直接能理解的就是 TransformerFactoryImpl 找不到,那么这个类在哪个包里呢? xalan,就去 apache 网上下载到 xalan.jar 包扔到应用的 WEB-INF/lib 目录中,重启 Tomcat 就能OK 了。

上面是第一种解决办法。问题是解决了,但是根由何在?难道就不能用别的 XML 解析器呢,难道 JDK 和 Tomcat 就没有为我们预备好对于 dwr 可用的 XML 解析器吗?先说个背景

·JDK1.3 没有 XML 解析器,所以要自己配上 xercesImpl.jar 和 xml-apis.jar

·JDK 1.4.0 和 JDK 1.4.1 虽然具有了 XML 解析器,但是有些 Bug,所以还是得把 xercesImpl.jar 放到 Tomcat/common/endorsed 目录中覆盖掉默认的解析器

·JDK 1.4.2 及后来版本的 XML 解析器可以工作的很好

·最后,那个出现错误本质原因还得由下面慢慢道来……

这样就是说 JDK 1.4.2 及更新版本根本用不着 xercesImpl.jar 和 xml-apis.jar 帮忙了。只要我们细心些就能发现在 Tomcat5.0.x/common/endorsed 目录中有两个包 xercesImpl.jar 和 xml-apis.jar。因为 Tomcat 加载 endorsed 中的包是通过参数 -Djava.endorsed.dirs="X:\Tomcat5.0.x\common\endorsed" 加载的,所以放在 endorsed 目录中的包要优于 JDK 的 rt.jar,所以要用 JDK 的 XML 解析器必须把 xercesImpl.jar 和 xml-apis.jar 从 endorsed 目录中移去,这是第二种解决办法。

再静心想一想,问题在 XML 解析器,为何偏偏是 org.apache.xalan.processor.TransformerFactoryImpl 这样的类名呢?这让我不免思考起 JDK 1.4 及 JDK 1.5 以上版本的差异来,再次回想起为何 Tomcat 5.5.x 版本需要 JDK 1.5 以上的版本来。

不妨做个实验,dwr 1.1.4 + JDK 1.4.2 + Tomcat 5.0.x,xercesImpl.jar 和 xml-apis.jar 仍旧让它们在 endorsed 目录中,运行最基本的 dwr 程序没一点问题。那为什么换个JDK就又行了呢?原因就在 xml-apis.jar 中指定了 TransformerFactory 的实现类全名为 org.apache.xalan.processor.TransformerFactoryImpl,它存在于 JDK 1.4.2 的 rt.jar 包中,而在 JDK 1.5 的 rt.jar 包中根本就没有 apache 的包了,所以它不行,再进一步,其实第二种解决办法如果用的是 JDK 1.5 以上版本仅仅需要把 xml-apis.jar 包从 endorsed 目录挪出就行了。

我按上面介绍的第二种方法,删除了endorsed下面的两个jar文件,再重启tomcat,查看日志,果然没报上面的那个错误,但一运行,还是不能显示该项目。

第二步:

查看MyEclipse下console控制台,发现有

严重: Error filterstart错误

上网查了一下:原文如下:

最近使用上了Tomcat 5.5,只是这东西在你最需要的时候,往往令你很失望。

  缘由代码要提交到CVS,删除了一些测试使用的类以及页面文件,只是当时忽略了去注释掉所删除的类在Struts.xml里Action映射。紧接着重新启动Tomcat,只是该站点无法访问,仔细查看Tomcat 5.5的日志,就发现:

严重: Error filterStart

信息,当时就检查初始化Struts2的Filter以及初始化对应的Servlet-api.jar,没有发现什么问题。最后实在没有办法,直接使用Tomcat 6,其启动时候抛出的异常告诉我无法加载在struts.xml配置的Java 类。这时候,我才明白,原来问题所在。

一旦struts.xml文件所配置的类在初始化的时候一旦不存在,则造成整个站点无法访问。

最后教训,一旦在struts.xml配置的类,若丢失的话,会影响整个站点的运行。

建议大家可以直接把站点直接放在Tocmat 6下面,用于取代tomat 5.5。Tomcat 5.5的错误日志太让人寒心了~

”其启动时候抛出的异常告诉我无法加载在struts.xml配置的Java 类“

这名话是关键,说的很明确说是找不着java类,在我的程序里就是LoginAction这个类,怎么会找不到呢,上struts.xml文件里一看,天啊,应该是class="com.test.action.LoginAction",而我写的是"com.test.LoginAction",改过以后,运行,好使!!!

感悟:错误很低级,但是通过这些错误学到很多知识和学习的方法。

---------------------------------------------------------------------

错误:java.lang.NoSuchMethodError: org.w3c.dom.Node.getTextContent()Ljava/lang/Str

参考:http://blog.sina.com.cn/s/blog_67cc72cc010135c4.html

此异常是因为jdk1.5以上的版本与tomcat\common\endorsed下的xml-apis.jar的类发生冲突,解决办法如下:

1,将common\endorsed下的xml-apis.jar移出或删掉. (已测试过)

2. 用xalan系列jar包替换原来的xercesImpl.jar和xml-apis.jar。

xalan系列jar包:serializer.jar、xalan.jar、xercesImpl.jar和xml-apis.jar。(网上留传的)

---------------------------------------------------------------------

2012-08-11 09:11

错误:jar not loaded. See Servlet Spec 2.3, section 9.7.2. 错误原因和解决办法

参考:http://hi.baidu.com/luoyeyilin/item/2d319cad125b979a151073b5

信息: validateJarFile(D:\xj\workspace\webworktest\webapp\WEB-INF\lib\servlet-api-2.4.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class

分析:

jsp-api.jar和servlet-api.jar这两个包tomcat的common\lib已经有了,必须将\WEB-INF\lib\目录下的去掉,否则会冲突的,会引起tomcat启动正常,而页面却总是无内容显示的错误

解决方案:

将\WEB-INF\lib\目录下的jsp-api.jar和servlet-api.jar删除

保证WEB-INF\lib跟tomcat5的common/lib下的JAR包没有重复的即可!