不能让Batik的JSVGCanvas在Maven项目中工作

时间:2014-09-16 05:08:21

标签: java swing maven svg batik

我花了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

轻得多

1 个答案:

答案 0 :(得分:0)

NoClassDefFoundError可能是因为其中一个蜡染罐不在您的classpath中。

这是在Maven中解决这个问题的一种方法:

  1. 列出pom.xml中的蜡染依赖项(假设您已经这样做了)

  2. 将以下插件添加到pom.xml

  3.   <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的名称的前面。

    1. 运行mvn package以生成您的jar。 Maven会将其放在./target

    2. 运行mvn dependency:copy-dependencies。这将导致Maven下载所有依赖项的jar并将它们放在./target/dependency中,classpathPrefix配置为查看。

    3. java -jar ./target/whatever-your-jar-is-names.jar应该正常运行。