Java';默认的JAXB实现是在我的类路径上选择的

Java';默认的JAXB实现是在我的类路径上选择的,java,xml,xslt,jaxb,classpath,Java,Xml,Xslt,Jaxb,Classpath,我已经编写了一个java应用程序,它利用JAXB进行XSL转换。我在类路径中包含了saxon9.jar,以便在命令行上使用XSLT2.0而不是XSLT1.0 java -classpath ./lib/saxon9.jar:./ -jar myApp.jar 我在XSL中包含了报告所用XSLT的代码 <xsl:comment><xsl:text > </xsl:text>XSLT Version: <xsl:value-of select="syste

我已经编写了一个java应用程序,它利用JAXB进行XSL转换。我在类路径中包含了saxon9.jar,以便在命令行上使用XSLT2.0而不是XSLT1.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>
这是JVM的一部分的默认实现

如何让它使用我指定的萨克森?


跟进:

因此,这些方法都不起作用(除了将saxon jar放在认可的目录中),但它们都应该起作用。似乎我使用“-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

您尝试过将jar放在目录中吗

如果不希望效果是全局的,请使用以下选项:

-Djava.endorsed.dirs=my_dir
在命令行中。

怎么样

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

此系统属性应设置替换TransformerFactory:

java -Djavax.xml.transform.TransformerFactory=com.foobar.AcmeTransformer MyApp
我相信您想要的工厂类是net.sf.saxon.TransformerFactoryImpl

查看javadoc,了解配置工厂的所有可能方法

  • 系统属性
  • lib/jaxp.properties
  • 服务配置文件(可能位于saxon JAR中,/META-INF/Services/javax.xml.transform.TransformerFactory)

  • 您发布的最后一个示例(w/o-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忽略命令行的其余部分,并从jar的清单文件中提取所有内容(包括类路径)。如果将saxon9.jar放在jar清单的类路径中,它应该可以工作

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

    这很管用,但我确实不喜欢。更改整个JVM似乎与类路径的目的背道而驰。我知道。但是,这是替换JVM类的唯一方法,最好避免。即使使用自己的类加载器,也无法从java或javax包中加载类。这破坏了其他应用程序。。。即eclipse.Resulted:Error发生在VM java/lang/NoClassDefFoundError:java/lang/Object Abort trapOh的初始化过程中,在这种情况下,我想您需要将rt.jar添加到bootclasspath中。仍在获取。。。线程“thread-1”javax.xml.transform.TransformerFactoryConfigurationError中出现异常:在javax.xml.transform.TransformerFactory.newInstance(TransformerFactory.java:109)中未找到提供程序net.sf.saxon.TransformerFactoryImpl,使用。。。java-Djavax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl-classpath./lib/saxon9.jar:./-jar myApp.jar