2012-05-25 3 views
4

Java-приложение FreeMind использует XSLT для обновления из старых файлов. XSLT использует статическую java-функцию для упрощения операций со строками. Это прекрасно работает до Java 7 обновлений 2 и дает следующее исключение в обновлении java7 4 под окнами:Расширения SecurityManager и XSLT в Java7 Update4 сломаны?

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) 

Доведение ее до минимального, например, он приходит, что обычай SecurityManager является преступным. Если установлено, код не работает. Если закомментировать, код работает. Кто-нибудь знает, что изменилось в системе безопасности java7 между обновлением 2 и обновлением 4 или что еще может вызвать это?

Вот еще минимальный пример:

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 считает, что этот метод не является статическим (но) и не попадает в ссылку на объект.

ТИА, Крис из FreeMind

EDIT: Кратчайший пример (достаточно установить только копию нормального менеджера безопасности) добавил.

+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 банки в jre/libs/endorsed) ИЛИ использовать Xalan в качестве третьей стороны lib.

Он работал для меня на Linux64 с J7U4 и Xalan 2.7.1

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

В папке с поддержкой Java есть небольшая опечатка: it на самом деле должно быть 'jre/lib/endorsed' – rhlobo

 Смежные вопросы

  • Нет связанных вопросов^_^