Camunda:无法转换为(相同 class)

Camunda: cannot be cast to (same class)

我在我的 Maven 项目中包含了一个 .jar,在 pom.xml 中编写了这个:

<dependencies>
    <dependency>
        <groupId>org.loopingdoge.acme.model</groupId>
        <artifactId>acme-model</artifactId>
        <version>1.0.0</version>
        <scope>system</scope>
        <systemPath>${basedir}/src/main/webapp/WEB-INF/lib/acme-model.jar</systemPath>
    </dependency>
</dependencies>

acme-model.jar 包含 org.loopingdoge.acme.model.House 但此转换

public class HouseAdder implements JavaDelegate {

    public void execute(DelegateExecution delegateExecution) throws Exception {
        House house = (House) delegateExecution.getVariable("house");
    }
}

在 Wildfly 服务器上部署时出现此错误:

18:50:20,255 ERROR [org.camunda.bpm.engine.context] (default task-45) ENGINE-16004 Exception while closing command context: org.loopingdoge.acme.model.House cannot be cast to org.loopingdoge.acme.model.House: java.lang.ClassCastException: org.loopingdoge.acme.model.House cannot be cast to org.loopingdoge.acme.model.House at org.loopingdoge.acme.services.HouseAdder.execute(HouseAdder.java:13)

当 class 将通过不同的 class 加载器加载时,就会发生这种情况。 java 即使 package 和 classname 相同,也要使它们不同。

您需要了解此 class 将以何种方式加载。第一步,找到包含 class.

的罐子

or/and read this on SO

我猜你在多个地方都有 class,例如在 WildFly 和您部署的 WAR 中打包 jar。检查 class 在 class 路径上是否只有一次。

顺便说一句:如果不是绝对必要,最好不要使用系统依赖项。这就是 Maven 存储库的用途。

运行成同样的问题。进一步的分析表明,使用了两个不同的 class 加载程序,如该线程中所述。在我的例子中,罪魁祸首是 spring boot 的 devtools,这个工具很可能会在他们的 pom.xml 中激活。似乎 devtools 不能很好地与(在我的情况下)camunda java 具有嵌入式 camunda 引擎的代表一起使用。