2009-02-13 2 views
6

Я написал приложение Java, которое использует JAXB для XSL-преобразований. Я включил saxon9.jar в свой путь к классам, чтобы использовать XSLT 2.0 вместо XSLT 1.0 в командной строке.Реализация Java по умолчанию JAXB выбрана по моему пути к классам

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

Я включил код в свой XSL, чтобы сообщить о используемом XSLT.

<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> 

Отчитывается.

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

Это реализация по умолчанию, являющаяся частью JVM.

Как я могу использовать саксон, который я указал?


Развейте:

Так ни один из этих методов не работал (за исключение размещения Саксонской баночки в одобренном каталоге), но все они должны работали. Кажется, комбинация моего использования «-jar myApp.jar» и желание альтернативной реализации XSLT были несовместимы. Другими словами ...

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

.. .does не работает, но это делает ...

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

... интересно, я даже не нужно указывать на завод, и я получаю Саксон версию ...

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

ответ

2

Вы пытались разместить свою банку в каталоге endorsed?

Если вы не хотите, эффект должен быть глобальным, используйте следующий вариант:

-Djava.endorsed.dirs=my_dir 

в командной строке.

+0

Это сработало, но мне это точно не нравится. Изменение всей моей JVM похоже на цель пути к классам. – dacracot

+0

Я знаю. Однако это единственный способ заменить класс JVM, и его лучше избегать. Даже с помощью собственных ClassLoaders вы не можете загрузить класс из пакетов java или javax. – kgiannakakis

+0

Это нарушило другие приложения ... а именно затмение. – dacracot

0

Как насчет

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

Результатом является: Ошибка при инициализации VM java/lang/NoClassDefFoundError: java/lang/Object Ловушка прерывания – dacracot

+0

О, я думаю, вам нужно добавить rt.jar в bootclasspath в этом случае. –

1

Это свойство системы следует установить сменную TransformerFactory:

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

Я считаю, класс фабрики вы хотите net.sf.saxon.TransformerFactoryImpl

+0

Все еще получается ... Исключение из потока «Thread-1» javax.xml.transform.TransformerFactoryConfigurationError: Provider net.sf.saxon.TransformerFactoryImpl не найден \t at javax.xml.transform.TransformerFactory.newInstance (TransformerFactory.java:109)) – dacracot

+0

Использование ... java -Djavax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl -classpath ./lib/saxon9.jar:./ -jar myApp.jar – dacracot

2

Проверьте javadoc на TransformerFactory.newInstance() для всех возможных способов настройки фабрики.

  1. Система свойств
  2. Библиотека/JAXP.свойства
  3. Услуги конфигурационного файла (может быть в саксонской JAR, /META-INF/services/javax.xml.transform.TransformerFactory)
2

В последнем примере вы размещены (без -Djavax ...) работает, так как каталог META-INF/услуги содержит файл с именем

java.xml.transform.TransformerFactory

с содержанием

net.sf.saxon.TransformerFactoryImpl

причина используя

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

работы и

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

не в том, что с помощью -jar опция говорит Java (ж) .exe игнорировать остальную часть командной строки и вытащить все (CLASSPATH в комплекте) от банка-х файл манифеста. Если вы поместите saxon9.jar в classpath явного манифеста, это должно сработать.

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