2009-02-13 35 views
6

Tôi đã viết một ứng dụng java sử dụng JAXB cho các phép biến đổi XSL. Tôi đã bao gồm saxon9.jar trong classpath của tôi để tôi có thể sử dụng XSLT 2.0 thay vì XSLT 1.0 trên dòng lệnh.Thực thi JAXB mặc định của Java được chọn trên đường dẫn lớp của tôi

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

Tôi đã bao gồm mã trong XSL để báo cáo XSLT được sử dụng.

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

Báo cáo sẽ báo cáo.

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

Đây là triển khai mặc định là một phần của JVM.

Tôi làm cách nào để sử dụng Saxon mà tôi đã chỉ định?


Theo dõi:

Vì vậy, không ai trong số những phương pháp làm việc (trừ đặt jar saxon trong thư mục xác nhận), nhưng tất cả đều phải làm việc. Có vẻ như sự kết hợp của tôi bằng cách sử dụng "-jar myApp.jar" và mong muốn một triển khai XSLT thay thế không tương thích. Nói cách khác ...

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

.. .does không hoạt động, nhưng điều này có nghĩa là ...

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

... thật thú vị, tôi thậm chí không phải chỉ định nhà máy và tôi nhận được phiên bản saxon ...

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

Trả lời

2

Bạn đã thử đặt bình của mình trong thư mục endorsed?

Nếu bạn không muốn ảnh hưởng đến tính toàn cầu, sử dụng tùy chọn sau đây:

-Djava.endorsed.dirs=my_dir 

trong dòng lệnh.

+0

Điều này hiệu quả nhưng tôi không thích điều đó. Thay đổi toàn bộ JVM của tôi dường như chống lại mục đích của classpath. – dacracot

+0

Tôi biết. Tuy nhiên đây là cách duy nhất để thay thế một lớp JVM và tốt nhất nên tránh. Ngay cả với ClassLoaders của riêng bạn, bạn không thể tải một lớp từ các gói java hoặc javax. – kgiannakakis

+0

Điều này đã phá vỡ các ứng dụng khác ... cụ thể là nhật thực. – dacracot

0

Làm thế nào về

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

Kết quả: Lỗi xảy ra trong khi khởi tạo VM java/lang/NoClassDefFoundError: java/lang/Object Bẫy hủy bỏ – dacracot

+0

Ồ, tôi đoán bạn cần phải thêm rt.jar vào bootclasspath trong trường hợp đó. –

1

sở hữu hệ thống này nên tạo ra TransformerFactory thay thế:

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

Tôi tin rằng lớp nhà máy bạn muốn là net.sf.saxon.TransformerFactoryImpl

+0

Vẫn nhận được ... Ngoại lệ trong chuỗi "Thread-1" javax.xml.transform.TransformerFactoryConfigurationError: Nhà cung cấp net.sf.saxon.TransformerFactoryImpl không tìm thấy \t tại javax.xml.transform.TransformerFactory.newInstance (TransformerFactory.java:109) – dacracot

+0

Sử dụng ... java -Djavax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl -classpath ./lib/saxon9.jar:./ -jar myApp.jar – dacracot

2

Kiểm tra javadoc cho TransformerFactory.newInstance() cho tất cả các cách có thể để cấu hình nhà máy.

  1. Thuộc tính hệ thống
  2. lib/jaxp.tính
  3. tập tin cấu hình dịch vụ (có thể trong JAR saxon, /META-INF/services/javax.xml.transform.TransformerFactory)
2

Ví dụ cuối cùng bạn được đăng (w/o -Djavax ...) hoạt động vì mục META-INF/dịch vụ có chứa một tập tin có tên

java.xml.transform.TransformerFactory

với nội dung

net.sf.saxon.TransformerFactoryImpl

lý do sử dụng

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

công trình và

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

không là sử dụng tùy chọn -jar nói với java (w) .exe để bỏ qua phần còn lại của dòng lệnh và kéo tất cả mọi thứ (classpath bao gồm) từ jar của tệp kê khai. Nếu bạn đặt saxon9.jar vào classpath của tệp kê khai thì nó sẽ hoạt động.

Manifest-Version: 1.0 
Main-Class: net.my.MainClass 
Class-Path: lib/saxon9.jar 
Các vấn đề liên quan