Я работаю над java 8 backend, предоставляя API остальных, построенный с его зависимостью (еще один проект, необходимый для выполнения первых проектов - давайте назовем его Project B ) в файле войны, который развернут на tomcat 8. Этот Project B использует пакет 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)
Класс, вызывающий ошибку, можно найти здесь .
Важно знать , что другой проект, использующий этот Проект B также в качестве зависимости, выполняется локально без каких-либо проблем (не веб-приложение и содержит простой основной вызов) , Вот почему я думаю, что развертывание или выполнение не работает должным образом или что-то пропустили, но я не мог понять реальную проблему.
Мой файл войны содержит «отсутствующий» класс:
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
вызывает проблему и не является исполняемым файлом, работающим внутри кота? Метод вызывается так:
Class<T> c = (Class<T>) InvokedynamicClassLoader.getClassLoader().register(className, code);
где className
выводит что-то вроде
es/uniovi/reflection/invokedynamic/Callable1
Спасибо за любые предложения из-за того, что я довольно новичок в Java.