java加载非java库_(Java 12)当库作为插件加载时,JAXB不工作

嗨,我正在更新我的一个Bukkit插件到java12(从8开始)

然而,正如大多数人所知,JAXB在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.(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)方法

是的,我试过把阴影的libs重新定位到com.sun.xml.内部.bind...

但不幸的是,我已经检查过它们是否真的在那里。

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

我已经把这个插件作为一个独立的测试运行,它工作了,所以这里唯一的变量似乎是Bukkit以及它是如何加载lib的。我对其他lib没有问题,这是第一次。

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

}

有什么建议吗?

敬陶

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值