Drools项目执行mvn clean install测试失败,mvn install却正常
首先,咱们来拆解这个问题:你遇到的Unexpected global [showResult]错误,本质是Drools会话在设置全局变量时,找不到规则文件中对应的全局变量声明。而Eclipse clean后测试正常、Maven clean install后失败的差异,根源是两者对资源文件和源目录的处理逻辑不同。
下面是具体的排查和解决步骤:
1. 先确认规则文件的全局变量声明
在你的.drl规则文件开头,必须显式声明这个全局变量,格式如下:
global util.showResult showResult;
Drools的规则引擎要求:所有通过session.setGlobal()设置的变量,必须先在规则包中定义,否则就会抛出Unexpected global异常。确保所有用到这个全局变量的规则文件都添加了该声明。
2. 修复Maven的测试资源目录配置
你的规则文件放在src/test/rules目录,但Maven默认只把src/test/resources当作测试资源目录,不会自动将src/test/rules下的文件复制到target/test-classes。这就导致Maven执行测试时,Drools加载不到规则文件,自然也解析不到全局变量的声明,最终触发错误。
解决方法是在pom.xml的<build>节点中添加测试资源配置,让Maven处理src/test/rules下的规则文件:
<build> <!-- 保留你原有的sourceDirectory、testSourceDirectory和compiler插件配置 --> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*</include> </includes> </resource> </resources> <testResources> <testResource> <directory>src/test/rules</directory> <includes> <include>**/*.drl</include> <!-- 如果有BPMN流程文件,也加上这一行 --> <include>**/*.bpmn2</include> </includes> </testResource> <testResource> <directory>src/test/resources</directory> <includes> <include>**/*</include> </includes> </testResource> </testResources> <!-- 保留原有的plugins配置 --> </build>
3. 检查Maven源目录配置是否正确
看你的pom.xml里,sourceDirectory设置为drools-tutorial/src/main/java,testSourceDirectory设置为drools-tutorial/src/test/java。如果你的项目结构是pom.xml直接放在项目根目录,且src目录也在根目录下,那这个路径配置是错误的——Maven会找不到主类的源代码,导致showResult类无法编译到target/classes,间接引发全局变量相关错误。
正确的配置应该是:
<sourceDirectory>src/main/java</sourceDirectory> <testSourceDirectory>src/test/java</testSourceDirectory>
如果你的项目确实有drools-tutorial子目录,那要确保目录结构和配置完全匹配,否则主类编译会失败。
4. 验证构建结果
完成上述修改后,执行mvn clean install,然后检查两个关键点:
target/classes/util/showResult.class是否存在(确认主类成功编译)target/test-classes下是否有你的.drl规则文件(确认资源文件被正确复制)
如果这两个文件都存在,测试应该就能正常通过了。
内容的提问来源于stack exchange,提问作者AndyG




