(Java 12) JAXB не работает, когда библиотека загружается как плагин - PullRequest
0 голосов
/ 22 марта 2020

Привет. В настоящее время я работаю над обновлением одного из моих плагинов Bukkit до java 12 (из 8). Любая другая библиотека вышла без проблем (если не считать обновления некоторых из них) Однако, как большинство из вас знает, JAXB был удален в J11 полностью, поэтому я использую эти зависимости

в моей толстой банке. Тем не менее, после компиляции, а затем запуска его, я получаю эту ошибку во время выполнения:

[13:34:48 WARN]: javax.xml.bind.DataBindingException: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
[13:34:48 WARN]:  - with linked exception:
[13:34:48 WARN]: [java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
[13:34:48 WARN]:        at javax.xml.bind.JAXB._marshal(JAXB.java:559)
[13:34:48 WARN]:        at javax.xml.bind.JAXB.marshal(JAXB.java:317)
[13:34:48 WARN]:        at me.taucu.server.minevictus.minesuiteus.Minesuiteus.marshalFile(Minesuiteus.java:702)
[13:34:48 WARN]:        at me.taucu.server.minevictus.minesuiteus.Minesuiteus.testXml(Minesuiteus.java:195)
[13:34:48 WARN]:        at me.taucu.server.minevictus.minesuiteus.Minesuiteus.onEnable(Minesuiteus.java:148)
[13:34:48 WARN]:        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263)
[13:34:48 WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:337)
[13:34:48 WARN]:        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:435)
[13:34:48 WARN]:        at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugin(CraftServer.java:470)
[13:34:48 WARN]:        at org.bukkit.craftbukkit.v1_15_R1.CraftServer.enablePlugins(CraftServer.java:384)
[13:34:48 WARN]:        at net.minecraft.server.v1_15_R1.MinecraftServer.a(MinecraftServer.java:482)
[13:34:48 WARN]:        at net.minecraft.server.v1_15_R1.DedicatedServer.init(DedicatedServer.java:299)
[13:34:48 WARN]:        at net.minecraft.server.v1_15_R1.MinecraftServer.run(MinecraftServer.java:885)
[13:34:48 WARN]:        at java.base/java.lang.Thread.run(Thread.java:830)
[13:34:48 WARN]: Caused by: javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
[13:34:48 WARN]:  - with linked exception:
[13:34:48 WARN]: [java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]
[13:34:48 WARN]:        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:232)
[13:34:48 WARN]:        at javax.xml.bind.ContextFinder.find(ContextFinder.java:375)
[13:34:48 WARN]:        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:691)
[13:34:48 WARN]:        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:632)
[13:34:48 WARN]:        at javax.xml.bind.JAXB$Cache.<init>(JAXB.java:97)
[13:34:48 WARN]:        at javax.xml.bind.JAXB.getContext(JAXB.java:124)
[13:34:48 WARN]:        at javax.xml.bind.JAXB._marshal(JAXB.java:548)
[13:34:48 WARN]:        ... 13 more
[13:34:48 WARN]: Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
[13:34:48 WARN]:        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
[13:34:48 WARN]:        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
[13:34:48 WARN]:        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
[13:34:48 WARN]:        at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:92)
[13:34:48 WARN]:        at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:125)
[13:34:48 WARN]:        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:230)
[13:34:48 WARN]:        ... 19 more
[13:34:48 ERROR]: [Minesuiteus] Exception while testing XML marshalling, cannot continue
[13:34:48 INFO]: [Minesuiteus] Disabling Minesuiteus v0.3.7
[13:34:48 INFO]: [Minesuiteus] Disabling Modules...
[13:34:48 INFO]: [Minesuiteus] Disabling Utilities...
[13:34:48 INFO]: [Minesuiteus] Shutting down executer services...

И это код:

    public static void marshalFile(Object obj, File clazzFileLocation) {
        JAXB.marshal(obj, clazzFileLocation);//Trying simple method in-case I did something wrong
        /*FileOutputStream out = null;
        try {
            out = new FileOutputStream(clazzFileLocation);
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
            m.marshal(obj, out);
        } catch (Throwable e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }*/
    }

Unmarshal использует большую часть того же простого JAXB # unmarshal ( file, clazztype) method

Да, я пытался переместить затененные библиотеки в com.sun. xml .internal.bind ... Но не повезло, и да, я проверил, что они на самом деле там .

Я знаю, что Bukkit использует несистемный загрузчик классов для загрузки плагинов (что имеет смысл). Но я думаю, что это является причиной проблемы.

Я запустил плагин как автономный test, и он сработал, поэтому единственная переменная здесь, похоже, Bukkit и как она загружает библиотеку. У меня нет проблем с другими библиотеками таким образом, это было первое.

Мой автономный тест

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Console console = System.console();
        Logger log = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME);
        if (console == null && ClassLoader.getSystemClassLoader() == Main.class.getClassLoader()) {
            PrintStream o = new PrintStream(new File("Minesuiteus-Headless.log")); 
            System.setOut(o);
            System.setErr(o); 
            log.info("Running in headless mode");
            log.info("### LOG START ###");
        } else {
            log.info("### START ###");
        }
        System.out.println();

        log.info("Testing XML");
        JAXB.marshal(new TestXML(), new File("./test.xml"));
        TestXML t = JAXB.unmarshal(new File("./test.xml"), TestXML.class);
        if (t == null) {
            System.out.println("Test returned null, not working");
        } else {
            System.out.println("Test worked!");
        }   
        log.info("Finished.");
    }

Есть предложения?

С уважением Тау

1 Ответ

0 голосов
/ 22 марта 2020

Эти зависимости, вероятно, удалены с сервера и больше не доступны. Попробуйте поискать в Google и найти новые версии этих зависимостей. Также проверьте совместимость друг с другом зависимости.

PS: проверьте, загружаете ли вы Maven. Я тоже боролся, а потом обнаружил, что не загружаю Maven.

Объяснение вашей трассировки стека: Зависимость не может быть найдена. Класс, имеющий зависимость, не может быть основан. Ошибка в классах, которые нуждаются в зависимости.

Убедитесь, что версия Java на сервере такая же, как на вашем компьютере. Попробуйте найти разные версии зависимостей, поскольку в центральном репозитории maven могут возникнуть проблемы. Проверьте, не используете ли вы встроенные методы, которые работают только в некоторых операционных системах.

Другая проблема заключается в том, что вы не загрузили на сервер какой-то jar-файл, установленный на вашем компьютере.

Проверьте, скачали ли вы версию Bukkit, которая работает с вашей версией JDK.

...