У нас есть основное приложение, написанное на java, которое строит некоторые из его зависимостей от времени выполнения, используя отражение.Зависимости строятся с использованием maven, и создается большой толстый jar, который содержит все файлы классов java (.class), файлы ресурсов и т. Д. (Включая файлы drools)
Эти зависимости имеют правила, написанные в drools, и мы хотимчтобы выполнить эти правила на ходу из основного приложения.
Я попытался запустить файл правил в одной из зависимостей, но получил исключительную ситуацию во время выполнения при создании экземпляра kiemodule.
Файл правил:
Вызывает статическую функцию для проверки, является ли переданная строка пустой или нет.
import static com.xxx.Utils.isEmpty;
rule "Hello World"
when
eval(isEmpty(""))
then
System.out.println("Called a method");
end
Основное приложение:
Загрузка класса: мы используем загрузчик пользовательского класса длязагрузить классы из репозитория Nexus.
public class CustomClassLoader extends URLClassLoader {
public CustomClassLoader(URL url, ClassLoader parent) {
super(new URL[]{ url }, parent);
}
@Override
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
return super.loadClass(name, resolve);
}
}
Обработчик правил:
public void initialiseKieContainer() throws IOException {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
for(Resource file : getRuleFiles()) {
kieFileSystem.write(ResourceFactory.newClassPathResource("rules/" + file.getFilename(), classLoader);
// classLoader is the instance of CustomClassLoader used to load the jar containing the rules file.
}
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
KieModule kieModule = kieBuilder.getKieModule();
this.kContainer = kieServices.newKieContainer(kieModule.getReleaseId());
}
/***
* returns rule files from resources
* @return
* @throws IOException
*/
private Resource[] getRuleFiles() throws IOException {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
return resourcePatternResolver.getResources("rules/rule.drl");
}
Когда я запускаю этот файл, я ожидаю, что правило должно быть выполнено, и я должен получить "Вызываетсяметод ", но я получаю это исключение:
java.lang.RuntimeException: Unable to get KieModule, Errors Existed: Error Messages:
Message [id=1, kieBase=defaultKieBase, level=ERROR, path=rules/rule.drl, line=3, column=0
text=Rule Compilation error Only a type can be imported. com.xxx.Utils.isEmpty resolves to a package
The method isEmpty(String) is undefined for the type Rule_Hello_World174429295]