ContextFactory не может быть найден в Eclipse - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть приложение на основе Eclipse, которое переносится с Java 8 на Java 11. Поскольку javax.xml и друзья были удалены из JDK, мне пришлось добавить его в качестве Import-Package для каждого подключаемого модуля, который нуждался в них.

Теперь, однако, при запуске этого кода

Marshaller marshaller = JAXBContext.newInstance(MyClass.class).createMarshaller();

я получаю следующее исключение:

java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at org.eclipse.osgi.internal.framework.ContextFinder.loadClass(ContextFinder.java:135)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at javax.xml.bind.ContextFinder.safeLoadClass(ContextFinder.java:480)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:184)

Я могу добавить com.sun.xml.bind, который должен иметь зависимость, но ничего не происходит.Это понятно, так как правила OSGi предотвращают взлом другого плагина с помощью рефлексии.

Однако я не могу добавить Require-Bundle или Import-Package в JDK или в пакет вокруг javax.xml.bind.

Существует ошибка , связанная с этой проблемой, но я не могу найти хорошее решение для своего приложения в комментариях.Тем не менее, я предполагаю, что это может быть исправлено для приложения Eclipse, иначе само Eclipse не должно работать на Java 11.

Как мне исправить это исключение?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Мы нашли совместимый с OSGi способ исправить это исключение:

  1. добавить следующие реализации на целевую платформу
    • org.apache.servicemix.specs.jaxb-api-2.2 (из центрального центра Maven)
    • com.sun.xml.bind (с платформы Eclipse; это та, которая содержит ContextFactory)
  2. , убедитесь, что эти пакеты запускаются с вашим приложением
  3. , убедитесь, чтопакет Apache запускается раньше, чем все остальное

Так что в Tycho это будет выглядеть так:

                <bundleStartLevel>
                    <bundle>
                        <id>org.apache.servicemix.specs.jaxb-api-2.2</id>
                        <autoStart>true</autoStart>
                        <level>1</level>
                    </bundle>
                </bundleStartLevel>

                <dependencies>
                    <dependency>
                        <artifactId>org.eclipse.e4.rcp</artifactId>
                        <type>eclipse-feature</type>
                    </dependency>
                    <dependency>
                        <type>p2-installable-unit</type>
                        <artifactId>org.apache.servicemix.specs.jaxb-api-2.2</artifactId>
                    </dependency>
                    <dependency>
                        <type>p2-installable-unit</type>
                        <artifactId>com.sun.xml.bind</artifactId>
                    </dependency>
                </dependencies>
0 голосов
/ 16 февраля 2019

Я тоже использую jaxb в своем приложении ( JMSToolBox ) и слишком мигрировал с Java 1.8 на Java 11, и у меня не было этой проблемы
В моем плагине у меня есть "lib"каталог с "jaxb-ri" jar и его зависимостями (от maven):

  • jaxb-api-2.3.1.jar
  • jaxb-runtime-2.3.2.jar
  • javax.activation-api-1.2.0.jar
  • istack-commons-runtime-3.0.7.jar

Затем плагин ссылается на эти банки (MANIFEST.MF + build.properties) и у меня нет проблем

Плагин здесь

...