Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 完全奇怪的ClassCastException_Java_Wildfly_Classcastexception - Fatal编程技术网

Java 完全奇怪的ClassCastException

Java 完全奇怪的ClassCastException,java,wildfly,classcastexception,Java,Wildfly,Classcastexception,我正在使用NetBeans和Maven构建一个JEE项目。该项目包含一个EJB模块、一个Web模块和一个SE类库。通常,Web模块将EJB模块作为依赖项。它们都将类库作为依赖项。该项目是一个多年来一直使用GlassFish或JBoss以及最近使用WildFly的项目的修改版。最初的项目是使用Ant构建和部署的。现在我正在使用Maven。新的(maven)项目使用GlassFish运行良好,但不使用WildFly 10。它在cast语句中抛出一个ClassCastException,该语句肯定不会

我正在使用NetBeans和Maven构建一个JEE项目。该项目包含一个EJB模块、一个Web模块和一个SE类库。通常,Web模块将EJB模块作为依赖项。它们都将类库作为依赖项。该项目是一个多年来一直使用GlassFish或JBoss以及最近使用WildFly的项目的修改版。最初的项目是使用Ant构建和部署的。现在我正在使用Maven。新的(maven)项目使用GlassFish运行良好,但不使用WildFly 10。它在cast语句中抛出一个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,但只有最后一条返回true根据这一点,位于类库(层次结构的根)中的接口I01不可从位于库外部的任何接口(EJB或Web模块)分配,不管这些接口是否扩展了它。一致地,尝试将I0101或I010101强制转换为I01将抛出ClassCastException


我非常感谢您能为我理解和解决这个问题提供帮助。

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

如果您的类使用不同的类加载器加载,那么您可能会有这种奇怪的行为。我以前在使用ear模块时也遇到过类似的问题。您好!谢谢你的回答。直到你提到类加载器,我才明白。我终于找到了问题和解决办法。我想这很可能发生在Maven greenhorns身上,就像我一样。问题是,我通过从EJB模块复制类库依赖项来将其添加到Web模块,但我没有意识到它需要有一点不同。解决方案是向Web模块依赖项添加一个作用域提供的元素。Web模块中的依赖关系导致Maven将类库也添加到war的lib目录中。因此,我最终两次使用同一个jar,并且类装入器必须同时装入这两个jar。使用Web模块中提供的作用域可以防止Maven将jar添加到war中,因此两个模块共享ear中唯一的jar。问题解决了。再次感谢。顺便说一句,我无法为这个问题添加答案,可能是因为它被标记为另一个问题的副本,并且似乎不适合为那个问题添加答案,因为那个问题是关于某人“玩类加载器”“,我根本没有这么做。关于这个主题的最后一点说明。正如我在问题中提到的,项目使用GlassFish运行得很好。因此GlassFish类加载器似乎没有在战争中加载jar(它就在那里,我刚刚检查过)。很有趣,不是吗?@user2734938 Glassfish和Wildlfy使用稍微不同的类加载方法,所以你有这个区别。虽然它们都是j2ee兼容的,但一旦从Glassfish迁移到Wildlfy,我们发现有很多问题需要解决。