我正在为Protege应用程序开发一个本体显示插件,这是符合OSGI的。我继承的图形库是Prefuse,它不兼容OSGI,并调用ImageIO来保存显示的图像。我已经看到在OSGI框架之外调用初始化问题,但是我尝试过的任何东西都解决不了ImageIO抛出的ImageIO,而且我也无法捕捉到异常。
IntelliJ是Java,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();
}
}
下面是抛出的异常。应用程序继续进行,但是对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]
发布于 2020-06-17 08:15:03
包org.visualdataweb.boa.protege
使用类ImageIO
并遇到错误。这表明包javax.imageio
不是由这个包导入的。如果已导入包,则在解析过程中会出现错误。但是,当加载第一个类时会得到错误,因此无法正确导入。
因为使用十亿工具几乎不可能做到这一点,所以我假设您使用PDE作为您的开发环境?在这种情况下,您应该将javax.imageio
的导入添加到META-INF/MANIFEST.MF
文件中。
如果这不是问题,你必须提供更多的信息。
通常,当您报告这样一个错误时,您使用的开发环境对于提供正确的支持是非常关键的。现在JVM版本也很关键,但是我可以在使用1.8的堆栈跟踪中看到它。
发布于 2020-06-17 15:31:06
我将javax.imageio.ImageIO添加到Maven导入部分,并收到上述所有错误。当我把它缩短为javax.imageio (正如彼得上面所建议的)时,它起了作用!
https://stackoverflow.com/questions/62418680
复制相似问题