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:
META-INF/services/javax.xml.transform.TransformerFactory entries in any of my application JAR files, library jars, or in the Tomcat jarsjavax.xml.transform.TransformerFactory system property is unset (verified at runtime through JVisualVM)jaxp.properties file in the jre/lib directoryRunning 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-compat files installed, as I was migrating from Java 1.4.2. The solution was to remove everything under the $CATALINA_HOME/common/endorsed directory (in particular xercesImpl.jar and xml-apis.jar) and the bin/jmx.jar files.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With