2012-05-25 74 views
4

Java應用程序FreeMind使用XSLT從舊文件進行更新。 XSLT使用靜態Java函數來簡化字符串操作。這工作得很好了對Java 7 Update 2和給出java7更新4以下異常windows下:Java7 Update4中的SecurityManager和XSLT擴展損壞了嗎?

STDERR: ERROR: 'The first argument to the non-static Java function 'replaceSpacesToNonbreakableSpaces' is not a valid object reference.' 
STDERR: FATAL ERROR: 'Could not compile stylesheet'May 26, 2012 10:50:06 PM freemind.main.Resources logException 
SEVERE: An exception occured: 
javax.xml.transform.TransformerConfigurationException: Could not compile stylesheet 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(Unknown Source) 
    at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(Unknown Source) 
    at freemind.main.Tools$1TransformerRunnable.run(Tools.java:1023) 
    at java.lang.Thread.run(Unknown Source) 

把它降低到最小的例子,它出現時,該自定義安全管理器是有罪的。如果設置,則代碼失敗。如果註釋掉,則代碼有效。有誰知道,在更新2和更新4之間java7的安全系統中發生了什麼變化,或者還有什麼會導致這種情況?

這裏是甚至更小例如:

package freemind.main; 

import java.io.StringReader; 
import java.io.StringWriter; 

import javax.xml.transform.Result; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.transform.stream.StreamSource; 

public final class FreeMindSecurityTest { 

    public static void main(String[] args) throws Exception { 
     // if commented out, this program works as expected. 
     System.setSecurityManager(new SecurityManager()); 
     String input = "<map version=\"0.9.0\">" 
       + "</map>"; 
     String xslt = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" 
       + "  <xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:FreeMindSecurityTest=\"xalan://freemind.main.FreeMindSecurityTest\" exclude-result-prefixes=\"FreeMindSecurityTest\">" 
       + "   <xsl:template    match=\"/ | node() | @* | comment() | processing-instruction()\">" 
       + "    <xsl:value-of select=\"FreeMindSecurityTest:replaceSpacesToNonbreakableSpaces('test')\"/>" 
       + "   </xsl:template>" + "  </xsl:stylesheet>"; 
     StringWriter writer = new StringWriter(); 
     final Result result = new StreamResult(writer); 

     final StreamSource sr = new StreamSource(new StringReader(input)); 
     // create an instance of TransformerFactory 
     TransformerFactory transFact = TransformerFactory.newInstance(); 
     Transformer trans = transFact.newTransformer(new StreamSource(
       new StringReader(xslt))); 

     trans.transform(sr, result); 

     System.out.println("Transformed: " + writer.getBuffer()); 
     writer.close(); 
    } 

    public static String replaceSpacesToNonbreakableSpaces(String input) { 
     return input; 
    } 



} 

簡言之,JAVA認爲,該方法不是靜態的(但它是)和射門對象引用。

TIA,克里斯從FreeMind的

編輯:最短例子(它足以設置只是一個正常的安全管理器的副本)添加。

+0

沒有人會看你的代碼,特別是當堆棧跟蹤是在德國。你可以縮小代碼並把它們放在這裏嗎?如果您不確定如何使用堆棧溢出,請首先閱讀http://stackoverflow.com/faq – gigadot

+0

用英語獲取消息的一種方法是將'user.language'系統屬性設置爲'en'。 – mzjn

+0

謝謝,上面編輯了英文輸出。 –

回答

2

JAXP 1.4.6 (in Java 7 Update 4)中可能存在一個錯誤。 Java 7u4中的更改是升級到JAXP 1.4.6,請參閱Java Release Notes

解決方法/解決方案(可能不是最佳選擇)是使用Xalan 2.7.1,而不需要通過Java endorsed folder提供額外補丁。 (將xalan 2.7.1 jar文件複製到jre/libs/endorsed) 或者將Xalan作爲第三方庫使用。

它爲我的LINUX64與J7U4和Xalan 2.7.1

Transformed: <?xml version="1.0" encoding="UTF-8"?>test 
+0

Java認可的文件夾有一個小錯字:它實際上應該是'jre/lib/endorsed' – rhlobo