Реализация JAXB по умолчанию Java выбрана по моему пути к классам - PullRequest
6 голосов
/ 13 февраля 2009

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

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

... не работает, но это работает ...

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

Ответы [ 5 ]

2 голосов
/ 13 апреля 2009

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

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 (w) .exe игнорировать остальную часть командной строки и извлекать все (включая classpath) из файла манифеста jar. Если вы поместите saxon9.jar в classpath вашего jar-манифеста, он должен работать.

Manifest-Version: 1.0
Main-Class: net.my.MainClass
Class-Path: lib/saxon9.jar
2 голосов
/ 15 февраля 2009

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

  1. Системное свойство
  2. Lib / jaxp.properties
  3. Файл конфигурации служб (может быть в саксонском JAR, /META-INF/services/javax.xml.transform.TransformerFactory)
2 голосов
/ 13 февраля 2009

Вы пытались поместить банку в каталог , подтвержденный ?

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

-Djava.endorsed.dirs=my_dir

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

1 голос
/ 14 февраля 2009

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

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

Я полагаю, что вам нужен фабричный класс net.sf.saxon.TransformerFactoryImpl

0 голосов
/ 14 февраля 2009

Как насчет

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