javax.xml.transform.TransformerFactoryConfigurationError的解决办法

javax.xml.transform.TransformerFactoryConfigurationError的解决办法2008-04-13 12:26

今天在做一个struts2的小程序时,遇到一个问题就是该网站不能被反问,分两步把这个问题人解决啦!!!

第一步:

去看tomcat的webapps,里边也部署上了。接着用昨天刚学的一招必杀,呵呵!去看C:\Program Files\Apache Software Foundation\Tomcat 5.0\logs下的日志,显示javax.xml.transform.TransformerFactoryConfigurationError Provider org.apache.xalan.processor.TransformerFactoryImpl not found

后来上网搜了一下:找到了一篇文章,说该问题是由于tomcat 里C:\Program Files\Apache Software Foundation\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",改过以后,运行,好使!!