Java 如何确定对象是类的哪个版本?
我正在尝试将插件写入框架应用程序(Joget)。我的插件源代码如下所示:Java 如何确定对象是类的哪个版本?,java,maven,Java,Maven,我正在尝试将插件写入框架应用程序(Joget)。我的插件源代码如下所示: public class MyPlugin extends ExtDefaultPlugin implements ApplicationPlugin, ParticipantPlugin { ... public void execute(){ ... SecurityContextImpl secContext = (SecurityContextImpl) WorkflowUtil.getH
public class MyPlugin extends ExtDefaultPlugin implements ApplicationPlugin, ParticipantPlugin {
...
public void execute(){
...
SecurityContextImpl secContext = (SecurityContextImpl) WorkflowUtil.getHttpServletRequest().getSession().getAttribute("SPRING_SECURITY_CONTEXT");
}
}
当我运行插件时,我得到以下异常
java.lang.ClassCastException: org.springframework.security.context.SecurityContextImpl cannot be cast to org.springframework.security.context.SecurityContextImpl
我在用Maven。现在,由于两者都有相同的包名,我假设我在插件JAR(包含SecurityContextImpl类)中意外使用了错误的包版本,而不是框架中的版本。但是我仔细检查了一下,看起来我的插件包中包含了正确的一个
有没有办法查看我的类的类加载器或源JAR(例如,以某种方式使用反射)?关于如何解决这个问题还有其他想法吗?这种类型的
java.lang.ClassCastException
,其中两个类名相等,当两个不同的类加载器加载相同的类或具有相同名称的两个类时会发生
我不知道Joget,但你说的是插件。框架通常在单独的类加载器中加载插件,以确保它们之间的适当隔离
既然你说我已经仔细检查过了,看起来我在插件包中包含了正确的插件,你可能想从你的包中删除spring security
,因为它可能已经被framework类加载器加载了
您使用的是
Maven
,因此您可以简单地将提供的添加到spring security
依赖项中(但不确定,因为我们没有您的pom.xml)我在运行插件时遇到了相同的异常
一般有两种情况:
1.这个班是本地班。
也就是说,插件的pom.xml中没有要部署的存储库(groupId、artificateId等)。解决方案是,转到目标文件夹,打开xxx-0.0.1-snapshot.jar文件,然后打开META-INF/MANIFEST.MF,添加该类的源文件/dependency/file.jar,然后将源jar添加到dependency文件夹
备注:最好给出本地文件的一个版本,并将其添加到pom.xml中,以便在代码中以src的形式找到
<!-- your source jar need to be renamed as example-1.0.0.jar -->
<dependency>
<groupId>this.should.be.the.prefix.of.your.package</groupID>
<artificateId>file.name<artificateId>
<version>1.0.0</version>
<systemPath>${basedir}/lib/stclient_updated-1.0.0.jar</systemPath>
<scope>system</scope>
</dependency>
this.should.be.the.prefix.of.your.package
查找源的官方存储库
我希望这能有所帮助
干杯我遇到过“jar地狱”或类似的类冲突,但除了仔细梳理pom并排除旧版本(如果它们是通过传递方式引入的)之外,从未找到一种可靠的方法来解决它。手工解析。顺便说一句,您可以从maven的“依赖关系树”(pom视图中的一个选项卡,或mvn dependency:tree
)中看到项目所需的所有jar。“X不能转换为X”错误通常(如果不总是)是由于类路径中有两个相同的jar。首先加载jar1,然后(出于任何原因)加载jar2。当这种情况发生时,JAR1中的类X和JAR2中的类X是不同的,即使JAR1和JAR2是完全重复的。难道的实例不起作用吗?