java - Spring 3 与 Drools 6 maven 不一致

标签 java spring maven spring-mvc drools

我在将 Drools 与 Spring 集成时遇到问题。我正在尝试制作一个简单的 Hello World spring 示例,我遇到了我的简单项目拒绝编译的时刻。 要使用像 @KSession 这样的 Drools 注释,我需要 drools-spring 包,但它似乎与 Spring 3 不兼容。作为构建器,我使用 Maven。这是我的 .pom 的样子:

<dependencies>
        <!-- Drools -->
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>6.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>6.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-decisiontables</artifactId>
            <version>6.0.0.Final</version>
        </dependency>
        <dependency>
        <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>6.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-internal</artifactId>
            <version>6.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-spring</artifactId>
            <version>6.0.0.Beta2</version>
        </dependency>

        <!-- Inject -->
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
            <version>1</version>
        </dependency>

        <!-- Spring 3 dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>3.2.4.RELEASE</version>
        </dependency>
</dependencies>


我使用非常简单的 Controller 类:

@Controller
@RequestMapping(value = "/")
public class BaseController extends AbstractController {

    private static final Logger log = Logger.getLogger(BaseController.class);

    @Autowired
    @KSession("ksession-rules")
    KieSession mySession;

    @RequestMapping(value = "/test")
    public @ResponseBody
    String test() {
        Fact myFact = new Fact();
        myFact.setFactNumber(20); //According to my rule when myFact.number>20 
                                  //then result will be set to "Hello World"

        mySession.insert(myFact);
        mySession.fireAllRules();

    return myFact.getResult();
    }
}

此时我收到一个错误: “类型 BaseController 的层次结构不一致”。
我注意到,如果我从依赖项列表中删除 drools-spring ,项目就会成功编译。但是,如果没有该包,我无法部署我的项目,因为部署者需要 drools 的类负责解释 @KSession 并且该类位于 drools-spring 包中。

经过一番调查,我的 Drools session 配置似乎有 与上述错误无关,因此为了简洁起见,我不会引用它们。相反,我将标记即使我不对 spring 配置进行任何修改并从示例中删除 KieSession,使其成为一个简单的 spring hello world 示例,我也会从 IDE 中收到一个相同的错误(Eclipse ):“BaseController 类型的层次结构不一致”,如果我删除 drools-spring 依赖项,问题就会消失。

在我看来这是依赖冲突。
有人在 drools+spring 上遇到过类似的问题吗?
有人可以建议解决该问题吗?
我做错了什么吗?

感谢您的帮助!

最佳答案

经过一番研究,我发现了两件事。

Drools 的 drools-spring 包声明了它自己的 spring 依赖项,这些依赖项覆盖了我的 spring 依赖项,这会导致 spring 故障。我所做的是手动从 drools-spring .pom 文件中删除 spring 依赖项。 我在上例中犯的另一个错误是我没有 kie-spring 作为依赖项。 Kie-spring 对于一个 drools bean KModuleBeanFactoryPostProcessor 是必需的,它负责从 spring 配置中读取我的 kmodule-kbase-ksession 配置。

解决这两个问题后,我的项目现在可以编译,我可以在代码中看到 KModuleBeanFactoryPostProcessor 定义我的配置正在按照我的预期被读取和分析。

关于java - Spring 3 与 Drools 6 maven 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22598430/

相关文章:

java - 在 Maven 测试范围内运行时,如何排除提供范围内的依赖项?

javascript - 如何为AngularJS搭建自动化测试环境

maven - 由于 "incompatible types",mvn 安装失败

Java JNA 似乎不起作用

java - 将进度条放入recyclerview android

java - 线程执行时停止循环执行

java - 如何在没有 persistence.xml 的情况下配置 Spring?

java - 即使它正确执行,但在 bean 定义中使用作用域时,它会给出警告错误

java - 修改LabelField的大小(黑莓)

java - Spring 3 的新特性是什么(与 Spring 2.5 相比)?