Я пытаюсь скомпилировать в памяти класс, который реализует интерфейс.
У меня есть интерфейс с именем CacheRule (в com / vpfw / proxy / logicRules / CacheRule.class).
У меня есть класс с именем CacheRuleBean
, который я компилирую в памяти.
Если этот класс не реализует CacheRule
, компиляция работает. Но если этот класс реализует CacheRule
, то ошибка:
java.lang.NoClassDefFoundError: com/vpfw/proxy/logicRules/CacheRule (wrong name: com/vpfw/proxy/logicRules/CacheRuleBean)
Любопытно, что если я выполню эту компиляцию внутри Eclipse, то это сработает.
Но когда я выполняю его из Tomcat, я получаю предыдущую ошибку.
Это код для интерфейса CacheRule
:
package com.vpfw.proxy.logicRules;
public interface CacheRule
{
void executeRule();
}
Это код для CacheRuleBean
:
package com.vpfw.proxy.logicRules;
import com.vpfw.proxy.logicRules.CacheRule;
public class CacheRuleBean implements CacheRule
{
public void executeRule() {}
}
И вызов для компиляции:
String[] compilationOptions = { "-cp", classDir };
return (new CompilerService().compile("com.vpfw.proxy.logicRules.CacheRuleBean",
source, compilationOptions));
Где
classDir
- это каталог /home/app/WEB-INF/classes
, в котором находится папка com
этого проекта (classPath верен, если я добавлю другие классы этого проекта в качестве импорта в CacheRuleBean
, скомпилируйте нормально).
- Название класса, который я использую, -
com.vpfw.proxy.logicRules.CacheRuleBean
.
source
- исходный код CacheRuleBean
.
CompilerService
- моя реализация API компилятора, которая прекрасно работает со всеми классами, кроме тех, которые реализуют интерфейс.
Что я могу делать не так?