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

时间:2013-06-13 19:23:34

标签: java maven

我正在尝试将插件编写到框架应用程序(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(例如以某种方式使用反射)?关于如何解决这个问题的任何其他想法?

2 个答案:

答案 0 :(得分:0)

这两种类名称等于的java.lang.ClassCastException类型出现在同一个类或两个具有相同名称的类由2个不同的类加载器加载时。

我不知道Joget,但你在谈论插件。框架通常在单独的类加载器中加载插件,以确保它们之间的适当隔离。

既然你说我已经仔细检查过,看起来我在我的插件包中包含了正确的。,你可能想要从你的包中删除spring-security,因为它可能已经被框架类加载器加载了。

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

答案 1 :(得分:0)

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

一般有两种情况:

1。该课程是本地课程。

也就是说,没有存储库(groupId,artificateId等)要部署在插件的pom.xml中。解决方法是,转到目标文件夹并打开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 Repository以找到源的官方存储库。

我希望它可以帮助=)

干杯