繁体   English   中英

如何确定对象是哪个版本的类?

[英]How do I determine which version of a class my object is?

我正在尝试将插件编写到框架应用程序(Joget)中。 我的插件源看起来像这样:

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 ,因为它可能已经由框架类加载器加载了。

您正在使用Maven ,因此您可以将<scope>provided</scope>spring-security依赖项中(但不确定,因为我们没有您的pom.xml)。

我在运行插件时遇到了同样的异常。

通常有两种情况:

1.该课程是当地课程。

也就是说,在插件的pom.xml中没有要部署的存储库(groupId,artificateId等)。 解决方法是,转到目标文件夹并打开xxx-0.0.1-snapshot.jar文件,然后打开META-INF / MANIFEST.MF,添加该类的源文件/dependency/file.jar,然后添加源jar到依赖文件夹

备注 :最好提供一个本地文件的版本,然后按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> 

2.该类是带有存储库的远程类

我曾经遇到过这种类型的问题,因为存储库不正确,另请参见Maven存储库以查找源的官方存储库。

我希望它可以帮助=)

干杯

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM