首页 > 解决方案 > (Java 12)当库作为插件加载时 JAXB 不起作用

问题描述

嗨,我目前正在将我的一个 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) 方法

是的,我已经尝试将阴影库重新定位到 com.sun.xml.internal.bind... 但没有运气,是的,我已经检查过它们确实在那里。

我知道 bukkit 使用非系统类加载器来加载插件(这是有道理的)但我认为这是导致问题的原因。

我已经将插件作为独立测试运行并且它工作正常,所以这里唯一的变量似乎是 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.");
    }

有什么建议么?

问候陶

标签: javaxmljaxbclassnotfoundexceptionbukkit

解决方案


这些依赖项可能已从服务器中删除并且不再可用。尝试在 google 上搜索并找到该依赖项的较新版本。还要检查彼此依赖项之间的兼容性。

PS:检查你是否下载了Maven。我也在苦苦挣扎,然后发现我没有下载 Maven。

堆栈跟踪的说明:找不到依赖项。无法创建具有依赖关系的类。需要依赖的类中的错误。

检查服务器上的 Java 版本是否与您计算机上的相同。尝试创建不同版本的依赖项,因为 maven 中央存储库中可能存在问题。检查您是否没有使用仅适用于某些操作系统的本机方法。

另一个问题是您没有在您的计算机上的服务器上上传一些 jar。

检查您是否下载了适用于您的 JDK 版本的 bukkit 版本。


推荐阅读