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: Кратчайший пример (достаточно установить только копию нормального менеджера безопасности) добавил.
Никто не будет читать ваш код, особенно когда стек трассировки на немецком языке. Не могли бы вы сузить код и поместить его сюда? Если вы не знаете, как использовать переполнение стека, прочитайте это сначала http://stackoverflow.com/faq – gigadot
Одним из способов получения сообщений на английском языке является установка системного свойства 'user.language'' 'en'. – mzjn
Спасибо, отредактировано выше с выходом на английский язык. –