首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java ImageIO: OSGI兼容的ClassNotFoundException中的第一次调用

Java ImageIO: OSGI兼容的ClassNotFoundException中的第一次调用
EN

Stack Overflow用户
提问于 2020-06-16 22:42:46
回答 2查看 146关注 0票数 0

我正在为Protege应用程序开发一个本体显示插件,这是符合OSGI的。我继承的图形库是Prefuse,它不兼容OSGI,并调用ImageIO来保存显示的图像。我已经看到在OSGI框架之外调用初始化问题,但是我尝试过的任何东西都解决不了ImageIO抛出的ImageIO,而且我也无法捕捉到异常。

IntelliJ是Java,Java是Java8。

是否有一些初始化可以从OSGI框架中“找到”ImageIO库?

下面是抛出错误的代码:

代码语言:javascript
运行
复制
public class SaveDisplayAction extends AbstractAction {

    private Display display;
    private JFileChooser chooser;
    private ScaleSelector scaler;
    private BufferedImage bufferedImage;

    /**
     * Create a new SaveDisplayAction for the given Display.
     * @param display the Display to capture
     */
    public SaveDisplayAction(Display display) {
        this.display = display;
    }

    private void init() {
        boolean useCache = ImageIO.getUseCache(); //     **<-- throws ClassDefNotFoundException**
    }


    /**
     * Shows the image export dialog and processes the results.
     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
     */
    public void actionPerformed(ActionEvent evt) {
        // lazy initialization
        if ( chooser == null )
            init();
    }
}

下面是抛出的异常。应用程序继续进行,但是对ImageIO库的任何进一步调用都会引发类似的异常。

代码语言:javascript
运行
复制
17:17:41.377 [AWT-EventQueue-0] ERROR o.p.editor.core.ProtegeApplication - Uncaught Exception in thread 'AWT-EventQueue-0'
java.lang.NoClassDefFoundError: javax/imageio/ImageIO
    at org.visualdataweb.vowl.controlView.SaveDisplayAction.init(SaveDisplayAction.java:54) ~[classes/:na]
    at org.visualdataweb.vowl.controlView.SaveDisplayAction.actionPerformed(SaveDisplayAction.java:119) ~[classes/:na]
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) ~[na:1.8.0_231]
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) ~[na:1.8.0_231]
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) ~[na:1.8.0_231]
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) ~[na:1.8.0_231]
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) ~[na:1.8.0_231]
    at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:289) ~[na:1.8.0_231]
    at java.awt.Component.processMouseEvent(Component.java:6539) ~[na:1.8.0_231]
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) ~[na:1.8.0_231]
    at java.awt.Component.processEvent(Component.java:6304) ~[na:1.8.0_231]
    at java.awt.Container.processEvent(Container.java:2239) ~[na:1.8.0_231]
    at java.awt.Component.dispatchEventImpl(Component.java:4889) ~[na:1.8.0_231]
    at java.awt.Container.dispatchEventImpl(Container.java:2297) ~[na:1.8.0_231]
    at java.awt.Component.dispatchEvent(Component.java:4711) ~[na:1.8.0_231]
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) ~[na:1.8.0_231]
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535) ~[na:1.8.0_231]
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) ~[na:1.8.0_231]
    at java.awt.Container.dispatchEventImpl(Container.java:2283) ~[na:1.8.0_231]
    at java.awt.Window.dispatchEventImpl(Window.java:2746) ~[na:1.8.0_231]
    at java.awt.Component.dispatchEvent(Component.java:4711) ~[na:1.8.0_231]
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) ~[na:1.8.0_231]
    at java.awt.EventQueue.access$500(EventQueue.java:97) ~[na:1.8.0_231]
    at java.awt.EventQueue$3.run(EventQueue.java:709) ~[na:1.8.0_231]
    at java.awt.EventQueue$3.run(EventQueue.java:703) ~[na:1.8.0_231]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_231]
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) ~[na:1.8.0_231]
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) ~[na:1.8.0_231]
    at java.awt.EventQueue$4.run(EventQueue.java:733) ~[na:1.8.0_231]
    at java.awt.EventQueue$4.run(EventQueue.java:731) ~[na:1.8.0_231]
    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_231]
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) ~[na:1.8.0_231]
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:730) ~[na:1.8.0_231]
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) [na:1.8.0_231]
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) [na:1.8.0_231]
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) [na:1.8.0_231]
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) [na:1.8.0_231]
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) [na:1.8.0_231]
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) [na:1.8.0_231]

Caused by: java.lang.ClassNotFoundException: javax.imageio.ImageIO not found by org.visualdataweb.boa.protege [20]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1574) ~[org.apache.felix.main-5.4.0.jar:na]
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79) ~[org.apache.felix.main-5.4.0.jar:na]
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018) ~[org.apache.felix.main-5.4.0.jar:na]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351) ~[na:1.8.0_231]
    ... 39 common frames omitted

在编译期间,我收到以下警告消息:

代码语言:javascript
运行
复制
Warning:osgi: [boa] Bundle-Activator org.protege.editor.core.plugin.DefaultPluginActivator is being imported into the bundle rather than being contained inside it. This is usually a bundle packaging error

如果我将javax.imageio添加到Maven导入部分,则插件在试图激活时失败。我想是因为javax.imageio不是一个符合OSGI的包吧?

代码语言:javascript
运行
复制
09:55:00.817 [FelixStartLevel] ERROR o.p.o.framework.FrameworkSlf4jLogger - Error starting file:/C:/Users/kcason/Documents/IdeaProjects/HPM/Protege/Protege-5.5.0-beta-3/plugins/boa-1.1.0.jar
org.osgi.framework.BundleException: Unable to resolve org.visualdataweb.boa.protege [20](R 20.0): missing requirement [org.visualdataweb.boa.protege [20](R 20.0)] osgi.wiring.package; (osgi.wiring.package=javax.imageio.ImageIO) Unresolved requirements: [[org.visualdataweb.boa.protege [20](R 20.0)] osgi.wiring.package; (osgi.wiring.package=javax.imageio.ImageIO)]
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4111) ~[org.apache.felix.main-5.4.0.jar:na]
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2117) ~[org.apache.felix.main-5.4.0.jar:na]
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1371) ~[org.apache.felix.main-5.4.0.jar:na]
    at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308) [org.apache.felix.main-5.4.0.jar:na]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_231]
EN

回答 2

Stack Overflow用户

发布于 2020-06-17 08:15:03

org.visualdataweb.boa.protege使用类ImageIO并遇到错误。这表明包javax.imageio不是由这个包导入的。如果已导入包,则在解析过程中会出现错误。但是,当加载第一个类时会得到错误,因此无法正确导入。

因为使用十亿工具几乎不可能做到这一点,所以我假设您使用PDE作为您的开发环境?在这种情况下,您应该将javax.imageio的导入添加到META-INF/MANIFEST.MF文件中。

如果这不是问题,你必须提供更多的信息。

通常,当您报告这样一个错误时,您使用的开发环境对于提供正确的支持是非常关键的。现在JVM版本也很关键,但是我可以在使用1.8的堆栈跟踪中看到它。

票数 1
EN

Stack Overflow用户

发布于 2020-06-17 15:31:06

我将javax.imageio.ImageIO添加到Maven导入部分,并收到上述所有错误。当我把它缩短为javax.imageio (正如彼得上面所建议的)时,它起了作用!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62418680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档