Java ImageIO: ClassNotFoundException при первом вызове в OSGI-совместимом Protege - PullRequest
0 голосов
/ 17 июня 2020

Я разрабатываю подключаемый модуль отображения онтологий для приложения 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]

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Пакет org.visualdataweb.boa.protege использует класс ImageIO и выдает ошибку. Это означает, что пакет javax.imageio не импортирован этим пакетом. Если бы пакет был импортирован, при разрешении возникла бы ошибка. Однако при загрузке первого класса вы получаете сообщение об ошибке, поэтому его нельзя правильно импортировать.

Поскольку это практически невозможно сделать с bndtools , я предполагаю, что вы используете PDE в качестве среды разработки ? В этом случае вам следует добавить импорт для javax.imageio в файл META-INF/MANIFEST.MF.

Если это не проблема, вам необходимо предоставить дополнительную информацию.

В целом , когда вы сообщаете о такой ошибке, среда разработки, которую вы используете, очень важна для обеспечения правильной поддержки. В настоящее время версия JVM также имеет решающее значение, но я мог видеть это в трассировке стека, которую вы используете 1.8.

0 голосов
/ 17 июня 2020

Даг наббит! Если бы я мог только следовать указаниям, это было бы проще. : -)

Я добавил javax.imageio.ImageIO в раздел импорта Maven и получил все ошибки, указанные выше. Когда я сократил его до javax.imageio (как предложил Питер выше), это сработало! Ши sh! (спасибо, Питер)

...