我正在开发一个Java 8后端,该数据库提供了一个带有其依赖关系的rest api(第一个项目需要执行另一个项目-我们将其称为 Project B ),该文件位于war文件中部署在tomcat 8上。此项目B 使用可以在here上找到的invokedynamic程序包。
执行多个方法将引发NoClassDefFoundError
。堆栈跟踪的摘录如下:
java.lang.NoClassDefFoundError: es/uniovi/reflection/invokedynamic/interfaces/Callable
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
at es.uniovi.reflection.invokedynamic.codegen.InvokedynamicClassLoader.register(InvokedynamicClassLoader.java:36)
at es.uniovi.reflection.invokedynamic.codegen.ClassGenerator.getInstance(ClassGenerator.java:107)
at es.uniovi.reflection.invokedynamic.MemberBSClass.getInstance(MemberBSClass.java:83)
at es.uniovi.reflection.invokedynamic.MemberBSClass.getCallable(MemberBSClass.java:44)
at es.uniovi.reflection.invokedynamic.ProxyFactory.getInvokedynamicCallable(ProxyFactory.java:773)
at es.uniovi.reflection.invokedynamic.ProxyFactory.generateInvokeDynamicCallable(ProxyFactory.java:91)
导致错误的类可以在here中找到。
重要的是要知道,另一个使用此 Project B 作为依赖项的项目也可以在本地运行而没有任何麻烦(不是Web应用程序,并且包含一个简单的main呼叫)。这就是为什么我认为部署或执行无法正常工作或错过了某些东西,但我无法弄清实际问题的原因。
我的战争文件包含“ missing”类:
WEB-INF/classes/es/uniovi/reflection/invokedynamic/interfaces/Callable.class
此文件的整体结构如下:
- error
- some error files
- META-INF
- MANIFEST.MF
- WEB-INF
- classes
- de. ... -> the backend project
- es / uniovi ... -> dependency of Project B
- net. ... -> the dependent project
- lib
- spring
- web-dev.xml
- web.xml
InvokedynamicClassLoader
是否有可能导致问题,并且无法在tomcat中运行?该方法以这种方式调用:
Class<T> c = (Class<T>) InvokedynamicClassLoader.getClassLoader().register(className, code);
className
输出类似
es/uniovi/reflection/invokedynamic/Callable1
由于我对Java很陌生,因此感谢您提出任何建议。