调试 ClassCastException。

huangapple go评论74阅读模式
英文:

Debug ClassCastException

问题

我遇到了一个 ClassCastException

无法将my.package.classA强制转换为my.package.classA。

请注意,(规范的)类(名)是相同的。

我理解这应该与不同的类加载器和/或从不同的JAR包加载类有关。
该项目使用Maven构建。
我能以某种方式调试出每种情况下使用了哪个类加载器,以及从哪个JAR包加载了这些类吗?

英文:

I run into a ClassCastException:

Cannot cast my.package.classA to my.package.classA.

Note that the (canonical) class (name) is the same.

I understand this should be related to different class loaders and/or loading the class from different jars.
The project is built using Maven.
Can I debug somehow which classloader was used in each case and from which jar the classes have been loaded?

答案1

得分: 4

ClassCastException添加一个断点。
对于IntelliJ,看起来是这样的:

调试 ClassCastException。

一旦捕获到异常,在调试器的调用层次结构中导航,直到找到应该发生转换的那一行,并且你拥有对两个类的引用。

例如:

调试 ClassCastException。

现在,你可以检查这两个类(在我的情况下是typeClassinstanceClass)。该类保存对其类加载器的引用。

在我的情况下,它是ModuleClassLoader for Module "my.ear" from Service Module Loader

ModuleClassLoader for Module "my-web-app.war" from Service Module Loader

调试 ClassCastException。

如你所见,一个类来自于ear,另一个来自于war。

在web-app的pom.xml中将依赖项更改为provided,这应该可以解决问题。

请注意,war文件将不再在ear之外运行,如果你需要两种情景,可以使用Maven配置文件

英文:

Add a breakpoint for ClassCastException.
For IntelliJ, this looks something like this:

调试 ClassCastException。

Once the exception is caught, navigate in the debugger call hierarchy until you find the line where the cast should happen and you have a reference to both classes.

For example:

调试 ClassCastException。

Now, you can inspect both classes (in my case typeClass and instanceClass). The class holds a reference to it's class loader.

In my case, it's ModuleClassLoader for Module "my.ear" from Service Module Loader
and
ModuleClassLoader for Module "my-web-app.war" from Service Module Loader

调试 ClassCastException。

As you can see, one class is coming from the ear, the other one from the war.

Change the dependency to provided in the web-app pom.xml, that should solve the problem.

Note that the war file will not run anymore outside of the ear, if you need both scenarios, use a Maven profile.

huangapple
  • 本文由 发表于 2020年9月30日 16:32:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/64133826.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定