Drools 7.4.1 kieservices.factory.get() возвращает ноль

Я пытаюсь интегрировать Drools 7.4.1 в веб-приложение в Tomcat.

Когда я вызываю в коде следующее заявление, чтобы получить KieService, я получаю null,

KieServices ks = KieServices.Factory.get();

Когда тот же метод вызывается из тестового метода, это нормально.

Кто-нибудь может помочь в этом?

5 ответов

Вы должны добавить drools-compiler в ваших зависимостях.

    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>7.4.1</version>
    </dependency>

Спасибо за отзыв Николь.торрес.

Для этой проблемы мы можем использовать appendtransformer, доступный в преобразователях ресурсов maven-shade-plugin:

https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html

Используя это, мы можем добавить все файлы META-INF/kie.conf. Посетите эту ветку любой, кто сталкивается с нулевым указателем при создании KieBase или KieContainer в банке убера. Я потратил три дня, чтобы найти решение, и попытался создать банку убербера почти для каждого примера проклятого слюни, доступного онлайн:(

У нас возникла та же проблема при попытке использовать Drools на нашем веб-сервере со встроенным http-сервером Grizzly.

Нам также нужно было добавить зависимость drools-compiler, но это само по себе не исправляет это.

Поскольку в пути к классам имеется несколько файлов kie.conf из разных зависимостей, в конечном итоге uber-jar будет иметь только одну единицу, а затем определения для загружаемых классов отсутствуют.

Помимо этих записей из drools-core kie.conf:

org.kie.api.io.KieResources = org.drools.core.io.impl.ResourceFactoryServiceImpl
org.kie.api.marshalling.KieMarshallers = org.drools.core.marshalling.impl.MarshallerProviderImpl
org.kie.api.concurrent.KieExecutors = org.drools.core.concurrent.ExecutorProviderImpl

мы добавили эти строки из drools-compiler в наш uber-jar kie.conf:

org.kie.api.KieServices = org.drools.compiler.kie.builder.impl.KieServicesImpl
org.kie.internal.builder.KnowledgeBuilderFactoryService = org.drools.compiler.builder.impl.KnowledgeBuilderFactoryServiceImpl

В противном случае KieServices не были загружены, а KieServices.Factory.get() вернул ноль.

Мы модифицируем встроенную банку после использования

jar uf myjar.jar META-INF/kie.conf

изменить содержащийся файл kie.conf. Мы не смогли найти чистое интегрированное решение с Maven. Любые предложения приветствуются...

По предложению @Carlos Costa, приведенные ниже изменения в pom.xml решили эту проблему.

Обобщая все предложения, ниже приведено подробное решение. В pom.xml добавьте следующее.

<dependencies>
  <dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>${runtime.version}</version>
  </dependency>
</dependencies>

А также

<build>
  <plugins>
    <plugin>
      <executions>
        <execution>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                <resource>META-INF/kie.conf</resource>
              </transformer>
            </transformers>
          </configuration>
       </execution>
     </executions>
    </plugin>
  </plugins>
</build>

Если вы строите с использованием gradle и shadow jar, вы можете добавить файлы kie.conf вместе, изменив задачу shadowJar

shadowJar {
    mergeServiceFiles()
    transform(com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer) {
      resource = "META-INF/kie.conf"
    }
}

Используйте последнюю версию пакета drools jar.

  <properties>
        <drools-version>7.16.0.Final</drools-version>
  </properties>
   <dependencies>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>${drools-version}</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>${drools-version}</version>
        </dependency>
</dependencies>

Вы должны добавить эти две зависимости и {версия} обеих зависимостей должна быть одинаковой

<dependency>
  <groupId>org.drools</groupId>
  <artifactId>drools-core</artifactId>
  <version>{version}</version>
</dependency>

<dependency>
  <groupId>org.drools</groupId>
  <artifactId>drools-compiler</artifactId>
  <version>{version}</version>
</dependency>

Это может произойти, потому что вы используете uber-jar, как это было предложено nicole.torres.

Другое решение состоит в том, чтобы вручную извлечь содержимое всех META-INF/kie.conf из ваших зависимостей (т.е. drools-core, drools-compiler и т. д.) и добавьте их в ваш проект src/main/resources/META-INF/kie.conf файл.

Преимущество перед другим решением заключается в том, что вам не нужно вручную изменять JAR-файл после его упаковки.

Если вы не используете uber-jar, то проблема может быть в чем-то другом, так как все зависимости должны быть доступны во время выполнения.

Другие вопросы по тегам