Я разрабатываю подключаемый модуль отображения онтологий для приложения Protege, совместимого с OSGI. Графическая библиотека, которую я унаследовал, называется Prefuse, которая НЕ OSGI-совместима и вызывает ImageIO для сохранения изображения дисплея. Я читал, что есть проблемы с инициализацией, вызываемые вне среды OSGI, но ничто из того, что я пробовал, не разрешило исключение ClassNotFoundException, вызванное ImageIO, и мне не удалось поймать исключение.
IDE - это IntelliJ IDEA, и Java версия - Java 8.
Есть ли какая-то инициализация, которая "найдет" библиотеку ImageIO изнутри OSGI framework?
Вот код, который вызывает ошибку:
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 import, плагин не работает при попытке активации. Я предполагаю, что это потому, что 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]