Привет. В настоящее время я работаю над обновлением одного из моих плагинов 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.");
}
Есть предложения?
С уважением Тау