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