gpt4 book ai didi

java - 无法使 Batik 中的 JSVGCanvas 在 Maven 项目中工作

转载 作者:太空宇宙 更新时间:2023-11-04 14:33:29 26 4
gpt4 key购买 nike

我花了 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,但它发生在 batik 类内部,并且我没有成功附加源代码,所以我什至无法尝试调试它...

我的代码非常简单:

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,但没有得到更好的结果。我一个人面临这种​​情况吗?

batik Maven:http://mvnrepository.com/artifact/org.apache.xmlgraphics

编辑:我发现它仅在依赖关系尊重特定文件夹层次结构时才有效。我什至不知道它会产生影响,因为它们都是导入的...无论如何,我被困住了,因为我不知道如何使用 Maven 创建层次结构...有什么想法吗?

编辑2:我发现svgSalamander这很快解决了我显示 svg 的问题。它比 JSVGCanvas 轻得多

最佳答案

NoClassDefFoundError 可能是因为其中一个 batik jar 不在您的类路径中。

这是在 Maven 中修复该问题的一种方法:

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

  2. 将以下插件添加到 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 的主 list 文件中的 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 然后应该可以正常运行。

  • 关于java - 无法使 Batik 中的 JSVGCanvas 在 Maven 项目中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25861041/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com