2009-02-13 11 views
6

He escrito una aplicación java que utiliza JAXB para transformaciones XSL. He incluido saxon9.jar en mi classpath para poder usar XSLT 2.0 en lugar de XSLT 1.0 en la línea de comandos.La implementación JAXB predeterminada de Java se elige sobre mi classpath

java -classpath ./lib/saxon9.jar:./ -jar myApp.jar 

He incluido el código en mi XSL para informar el XSLT utilizado.

<xsl:comment><xsl:text > 
</xsl:text>XSLT Version: <xsl:value-of select="system-property('xsl:version')" /> <xsl:text > 
</xsl:text>XSLT Vendor: <xsl:value-of select="system-property('xsl:vendor')" /> <xsl:text > 
</xsl:text>XSLT Vendor URL: <xsl:value-of select="system-property('xsl:vendor-url')" /> <xsl:text > 
</xsl:text></xsl:comment> 

Informa.

XSLT Version: 1.0 
XSLT Vendor: Apache Software Foundation (Xalan XSLTC) 
XSLT Vendor URL: http://xml.apache.org/xalan-j 

Esta es la implementación predeterminada que forma parte de la JVM.

¿Cómo hago para usar el Saxon que he especificado?


seguimiento:

Así que ninguno de estos métodos trabajado (excepto la colocación de la jarra sajón en el directorio de aprobación), pero todos ellos deberían haber funcionado. Parece que la combinación de mi uso del "-jar myApp.jar" y el deseo de una implementación XSLT alternativa eran incompatibles. En otras palabras ...

java -classpath -Djavax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl ./lib/saxon9.jar:./-jar myApp.jar

.. .no funciona, pero esto sí ...

java -Djavax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl -classpath ./lib/saxon9.jar:./myApp.jar org.dacracot .myApp

... curiosamente, no tienen ni siquiera para especificar la fábrica y me sale la versión sajona ...

java-classpath ./lib/saxon9.jar:./myApp.jar org.dacracot.myApp

Respuesta

2

¿Ha intentado colocar el jar en el directorio endorsed?

Si no desea que el efecto sea global, utilice la siguiente opción:

-Djava.endorsed.dirs=my_dir 

en la línea de comandos.

+0

Esto funcionó, pero seguro que no me gusta. Cambiar mi JVM completa parece contrario al propósito de la ruta de clases. – dacracot

+0

Lo sé. Sin embargo, esta es la única forma de reemplazar una clase JVM y es mejor evitarla. Incluso con sus propios ClassLoaders no puede cargar una clase de los paquetes java o javax. – kgiannakakis

+0

Esto rompió otras aplicaciones ... es decir, eclipse. – dacracot

0

¿Qué tal

java -Xbootclasspath:lib/saxon9.jar -classpath . -jar myApp.jar 
+0

Resultó en: Se produjo un error durante la inicialización de VM java/lang/NoClassDefFoundError: java/lang/Object Abortar la trampa – dacracot

+0

Oh, supongo que necesita agregar rt.jar a la ruta de arranque en ese caso. –

1

Esta propiedad del sistema debe configurar el reemplazo TransformerFactory:

java -Djavax.xml.transform.TransformerFactory=com.foobar.AcmeTransformer MyApp 

Creo que la clase de fábrica que queremos es net.sf.saxon.TransformerFactoryImpl

+0

Obteniendo ... Excepción en el hilo "Thread-1" javax.xml.transform.TransformerFactoryConfigurationError: Provider net.sf.saxon.TransformerFactoryImpl no encontrado \t en javax.xml.transform.TransformerFactory.newInstance (TransformerFactory.java:109) – dacracot

+0

Usando ... java -Djavax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl -classpath ./lib/saxon9.jar:./ -jar myApp.jar – dacracot

2

Consulte el javadoc para TransformerFactory.newInstance() para conocer todas las formas posibles de configurar la fábrica.

  1. sistema de propiedad
  2. lib/jaxp.
  3. propiedades
  4. archivo de configuración de Servicios (puede estar en el JAR sajón, /META-INF/services/javax.xml.transform.TransformerFactory)
2

El último ejemplo informados (w/o -Djavax ...) funciona porque el directorio META-INF/services contiene un archivo denominado

java.xml.transform.TransformerFactory

con el contenido

net.sf.saxon.TransformerFactoryImpl

la razón usando

java -cp lib/saxon9.jar;myjar.jar 

obras y

java -cp lib/saxon9.jar -jar myjar.jar 

hace no es que el uso de la opción -jar le dice a java (w) .exe ignorar el resto de la línea de comandos y tirar de todo (incluido ruta de clase) de la jarra de archivo de manifiesto Si coloca saxon9.jar en el classpath del manifiesto jar, debería funcionar.

Manifest-Version: 1.0 
Main-Class: net.my.MainClass 
Class-Path: lib/saxon9.jar 
Cuestiones relacionadas