Drools kie-ci示例在Uber Jar中运行失败但Eclipse IDE中正常
从你的异常堆栈和描述来看,这个问题的核心是maven-shade-plugin在构建Uber Jar时破坏了Drools依赖的Maven集成组件配置——具体来说是Plexus容器找不到MavenExecutionRequestPopulator组件,这是因为Shade默认会覆盖多个JAR中同名的META-INF配置文件,而Drools的Maven集成模块(比如appformer-maven-integration)依赖这些配置来加载组件。
下面给你两个可行的解决方案,按优先级推荐:
方案1:改用maven-assembly-plugin替代Shade插件
Shade插件的“合并Jar”逻辑对依赖Plexus、ServiceLoader这类需要保留多份配置的场景很不友好。Assembly插件的jar-with-dependencies描述符会更安全地打包所有依赖,并且默认合并必要的配置文件。
操作步骤:
- 移除pom.xml中现有的
maven-shade-plugin配置块 - 添加以下
maven-assembly-plugin配置(替换成你的主类全路径):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <id>build-fat-jar</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <archive> <manifest> <mainClass>com.yourpackage.YourMainClass</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <appendAssemblyId>false</appendAssemblyId> </configuration> </execution> </executions> </plugin>
- 执行
mvn clean package,然后用生成的Jar文件运行:java -jar your-app.jar
方案2:如果必须用Shade插件,添加配置保留关键文件
如果你因为某些原因必须使用Shade插件,需要配置它合并而不是覆盖关键的配置文件:
修改你的maven-shade-plugin配置,添加以下transformers:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 指定主类 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourpackage.YourMainClass</mainClass> </transformer> <!-- 合并Plexus组件配置文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer"> <resource>META-INF/plexus/components.xml</resource> </transformer> <!-- 合并Drools的kie.conf配置 --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/kie.conf</resource> </transformer> <!-- 合并ServiceLoader服务文件 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin>
额外检查项
- 确认你的pom.xml中包含
org.appformer:appformer-maven-integration依赖,并且依赖范围是compile或runtime(不要设为provided) - 运行Jar时,确保本地Maven仓库的
settings.xml(默认在~/.m2/settings.xml)存在且配置正常,Drools的Maven扫描器会依赖这个配置定位本地仓库
内容的提问来源于stack exchange,提问作者Carlos Costa
相关产品推荐
相关产品推荐

