我花了7个小时试图让Batik的JSVGCanvas显示一个简单的svg文件。我无法使它发挥作用。有趣的是,鉴于我使用的依赖项版本,我总是得到不同的错误消息。我的最后一次尝试给了我:
java.lang.NoSuchMethodError: org.apache.batik.dom.svg.SVGDOMImplementation.createCSSEngine(Lorg/apache/batik/dom/svg/SVGOMDocument;Lorg/apache/batik/css/engine/CSSContext;)Lorg/apache/batik/css/engine/CSSEngine;
at org.apache.batik.bridge.BridgeContext.initializeDocument(Unknown Source)
at org.apache.batik.bridge.GVTBuilder.build(Unknown Source)
at org.apache.batik.swing.svg.GVTTreeBuilder.run(Unknown Source)
有时也是:
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/apache/batik/gvt/event/AbstractAWTEventDispatcher
Caused by: java.lang.ClassNotFoundException: org.apache.batik.gvt.event.AbstractAWTEventDispatcher
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
但我已经看到了成千上万的这些错误,总是关于noSuchMethodException或ClassNotFoundException,但它发生在蜡染类中,我没有成功附加源代码,所以我甚至无法尝试调试它...
我的代码非常简单:
public class Test {
private static JFrame mainFrame;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
mainFrame = new JFrame("test");
mainFrame.setSize(800,600);
mainFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
mainFrame.setVisible(true);
Container pane = mainFrame.getContentPane();
pane.setLayout(new BorderLayout());
JSVGCanvas canvas = new JSVGCanvas();
canvas.setURI("file:///home/floz/NetBeansProjects/test/test.svg");
pane.add(canvas, BorderLayout.CENTER);
}
});
}
}
代码在正常依赖项下运行良好,但是如果我使用Maven项目它不起作用。我试图加载本地jar,但我没有得到更好的结果。在这种情况下,我一个人吗?
Maven for batik:http://mvnrepository.com/artifact/org.apache.xmlgraphics
编辑:我发现仅当依赖项遵循特定的文件夹层次结构时它才有效。我甚至都不知道它可以有所作为,因为它们都是进口的......任何可能,我都被卡住了,因为我不知道如何用Maven创建一个层次结构......任何想法?
EDIT2:我发现svgSalamander很快解决了显示svg的问题。它比JSVGCanvas
轻得多答案 0 :(得分:0)
NoClassDefFoundError
可能是因为其中一个蜡染罐不在您的classpath
中。
这是在Maven中解决这个问题的一种方法:
列出pom.xml中的蜡染依赖项(假设您已经这样做了)
将以下插件添加到pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mycompany.app.App</mainClass>
<classpathPrefix>dependency/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
addClasspath
行告诉Maven将依赖项添加到它生成的jar中主清单文件中的classpath
。
mainClass
行需要描绘您的主要课程。
classpathPrefix
告诉Maven将dependency/
添加到它放在类路径上的依赖项jar的名称的前面。
运行mvn package
以生成您的jar。 Maven会将其放在./target
运行mvn dependency:copy-dependencies
。这将导致Maven下载所有依赖项的jar并将它们放在./target/dependency
中,classpathPrefix
配置为查看。
java -jar ./target/whatever-your-jar-is-names.jar
应该正常运行。