I’ve got a Tomcat 5.5 web application that uses the Apache Commons-Configuration library to generate an XML configuration file at runtime. Commons-Configuration, in turn, uses the javax.xml.transform JAXP API to accomplish this.
Since upgrading to Java 7, the operation fails with the following error message:
Caused by: javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found
at javax.xml.transform.TransformerFactory.newInstance(Unknown Source)
In past releases, I’ve never bundled xalan.jar, instead relying on the platform default XSLT implementation.
Some things I’ve checked:
- There are no
META-INF/services/javax.xml.transform.TransformerFactoryentries in any of my application JAR files, library jars, or in the Tomcat jars - The
javax.xml.transform.TransformerFactorysystem property is unset (verified at runtime through JVisualVM) - There is no
jaxp.propertiesfile in thejre/libdirectory
Running with -Djaxp.debug=1 produces the following output:
JAXP: find factoryId =javax.xml.transform.TransformerFactory
JAXP: loaded from fallback value: org.apache.xalan.processor.TransformerFactoryImpl
Where’s this fallback value coming from? Oracle ships the Xalan transformer, but since 1.7 has repackaged it as com.sun.org.apache.xalan.processor.... Shouldn’t that be the fallback value?
Found the issue myself. It turns out that I had the
apache-tomcat-5.5.23-compatfiles installed, as I was migrating from Java 1.4.2. The solution was to remove everything under the$CATALINA_HOME/common/endorseddirectory (in particularxercesImpl.jarandxml-apis.jar) and thebin/jmx.jarfiles.