((Java 12)JAXB在将库作为插件加载时不起作用

问题描述 投票:0回答:1

[嗨,我目前正在将我的Bukkit插件之一更新为Java 12(从8开始)其他所有图书馆都顺利进行(没有更新其中的一些)但是,正如您大多数人所知,JAX已在J11中完全删除,因此我正在使用these dependencies

在我的胖罐子里。但是,在编译然后运行它之后,我得到了这个运行时错误:

[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.");
    }

有什么建议吗?

问候头

java xml jaxb classnotfoundexception bukkit
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.