完全奇怪的ClassCastException

时间:2016-06-19 04:29:09

标签: java wildfly classcastexception

我正在使用NetBeans和Maven构建JEE项目。该项目包含EJB模块,Web模块和SE类库。像往常一样,Web模块将EJB模块作为依赖项。它们都将类库作为依赖项。该项目是一个项目的修改副本,该项目使用GlassFish或JBoss以及最近的WildFly工作多年。原始项目是使用Ant构建和部署的。现在我正在使用Maven。新的(maven)项目使用GlassFish运行得很好,但没有使用WildFly 10.它会在一个最终不应该失败的强制转换语句中抛出一个ClassCastException。为了确定问题的根源,我进行了一个简单的测试。结果完全奇怪。这是:

首先,我创建了3个接口,一个在类库中,一个在每个模块中。这些是:

// interface at the class library
package jee2ap102.lib;
public interface I01 {
}

// interface at the EJB module
package jee2ap102.ejb;
public interface I0101 extends jee2ap102.lib.I01 {
}

// interface at the Web module
package jee2ap102.web;
public interface I010101 extends jee2ap102.ejb.I0101 {
}

然后在Web模块中我创建了一个bean并添加了以下方法:

public String check() {
    boolean b;
    b = jee2ap102.lib.I01.class.isAssignableFrom(jee2ap102.ejb.I0101.class);
    b = jee2ap102.lib.I01.class.isAssignableFrom(jee2ap102.web.I010101.class);
    b = jee2ap102.ejb.I0101.class.isAssignableFrom(jee2ap102.web.I010101.class);
}

这三个陈述应该返回true,但只有最后一个。 根据这一点,位于类库中的接口I01(层次结构的根)不能从位于库外部的任何接口(EJB或Web模块)分配,无论这些接口是什么接口扩展它。一致地,将I0101或I010101转换为I01的尝试将抛出ClassCastException。

我非常感谢您理解和解决这个问题的任何帮助。

1 个答案:

答案 0 :(得分:2)

根据我的评论,这个问题很可能是因为war arhive使用lib jar中的不同类加载器。这被描述为in this question