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

Java ImageIO:ClassNotFoundException在OSGI兼容的Protege中的第一次调用,java,plugins,osgi,javax.imageio,protege,Java,Plugins,Osgi,Javax.imageio,Protege,我正在为Protege应用程序开发一个本体显示插件,它符合OSGI。我继承的图形库是Prefuse,它不符合OSGI,并调用ImageIO来保存显示器的图像。我已经了解到在OSGI框架之外调用时存在初始化问题,但是我没有尝试解决ImageIO引发的ClassNotFoundException,而且我还没有捕获到异常 IDE是IntelliJ IDEA,Java版本是Java8 是否有一些初始化可以从OSGI框架中“找到”ImageIO库 以下是引发错误的代码: public class Save

我正在为Protege应用程序开发一个本体显示插件,它符合OSGI。我继承的图形库是Prefuse,它不符合OSGI,并调用ImageIO来保存显示器的图像。我已经了解到在OSGI框架之外调用时存在初始化问题,但是我没有尝试解决ImageIO引发的ClassNotFoundException,而且我还没有捕获到异常

IDE是IntelliJ IDEA,Java版本是Java8

是否有一些初始化可以从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();
    }
}
在编译过程中,我收到以下警告消息:

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]

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

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

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


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

我将javax.imageio.imageio添加到Maven导入部分,并收到上面所有的错误。当我把它缩短为javax.imageio(正如上面Peter所建议的那样)时,它成功了

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]