Java ImageIO:在兼容OSGI的Protege中第一次调用时出现ClassNotFoundException异常

问题描述 投票:0回答:1

我正在为Protege应用开发一个本体显示插件,它符合OSGI标准。我继承的图形库是Prefuse,它是 符合OSGI标准,并调用ImageIO来保存显示器的图像。我读到有在OSGI框架外调用的初始化问题,但我试过的任何方法都不能解决ImageIO抛出的ClassNotFoundException,我也没能抓住这个异常。

IDE是IntelliJ IDEA,Java版本是Java 8。

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

下面是抛出错误的代码。

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库的进一步调用都会抛出类似的异常。

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

在编译过程中,我得到了这个警告信息。

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的捆绑包?

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]
java plugins osgi javax.imageio protege
1个回答
1
投票

捆绑包 org.visualdataweb.boa.protege 使用类 ImageIO 并遇到一个错误。这表明该软件包 javax.imageio 没有被这个软件包导入。如果这个包被导入了,你在解析过程中就会出现错误。然而,当第一个类被加载时,你会得到这个错误,所以它不能被正确导入。

由于这几乎是不可能做到的,所以 bndtools我假设你使用PDE作为你的开发环境?在这种情况下,你应该添加导入的 javax.imageioMETA-INF/MANIFEST.MF 文件。

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

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


0
投票

Dag nabbit! 如果我可以按照说明来做,那就简单多了 :-)

我将javax.imageio.ImageIO添加到Maven导入部分,收到了上面所有的错误。当我把它缩短为javax.imageio时(按照上面Peter的建议),它就成功了。Sheesh! (谢谢Peter)

© www.soinside.com 2019 - 2024. All rights reserved.