java - JBOSS 6.0如何解决ear文件之间的类加载问题?

标签 java jakarta-ee ejb classloader jboss6.x

我有一个包含这个 bean 的 ear 文件

@Stateless
public class ProjectServiceImpl implements ProjectServiceLocal, ProjectServiceRemote {

    @Override
    public List<Project> listProjects() {
        Project project = new Project();
        project.setId(0l);
        project.setName("Foo");
        return Arrays.asList(project);
    }

}

第二个 ear 文件有这个 bean

@Stateless
public class EntryServiceImpl implements EntryServiceLocal, EntryServiceRemote {

    @EJB(lookup="packagename/ProjectServiceImpl/local")
    private ProjectServiceLocal projectService;

    @Override
    public List<Entry> listEntries() {
        Project project = projectService.listProjects().get(0); // here happens the class cast exception
        Entry entry = new Entry();
        entry.setId(0l);
        entry.setProject(project);
        entry.setFrom(new Date());
        entry.setTo(new Date());
        return Arrays.asList(entry);
    }
}

这是我得到的异常:

Exception in thread "main" javax.ejb.EJBException: java.lang.ClassCastException: packagename.dto.Project cannot be cast to packagename.dto.Project
    at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:183)
    at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:251)
    at org.jboss.ejb3.tx2.impl.CMTTxInterceptor.required(CMTTxInterceptor.java:349)

我该如何解决这个问题?

我知道这两个 ear 文件都配置了不同的类加载器,但我不知道如何将它们配置为具有相同的类加载器。

这大致就是我的 jboss-app.xml 中的内容

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE jboss-app
    PUBLIC "-//JBoss//DTD J2EE Application 4.2//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-app_4_2.dtd\">

<jboss-app>
    <loader-repository>
        packagename:archive=ear1.ear
    </loader-repository>
</jboss-app>

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE jboss-app
    PUBLIC "-//JBoss//DTD J2EE Application 4.2//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-app_4_2.dtd\">

<jboss-app>
    <loader-repository>
        packagename:archive=ear2.ear
    </loader-repository>
</jboss-app>

我还为每只耳朵创建了一个 jboss-classloading.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
    <classloading xmlns="urn:jboss:classloading:1.0" name="ear1.ear" domain="packagename">
</classloading>

<?xml version="1.0" encoding="UTF-8"?>
    <classloading xmlns="urn:jboss:classloading:1.0" name="ear2.ear" domain="packagename">
</classloading>

但没有任何作用。而且我找不到任何有用的文档。

最佳答案

使用加载器存储库标签,您可以告诉 JBoss 将每只耳朵放在一个单独的类加载器中。

如果您通常需要隔离,您可以将有问题的类放在一个 jar 文件中,例如在 server//lib 中,以便它位于双耳都可以访问(通过委托(delegate))的基类加载器中。

或者您可以将 ear 部署器设置为没有类加载器隔离并删除那些加载器存储库,这样类最终会出现在 UCL 中。

关于java - JBOSS 6.0如何解决ear文件之间的类加载问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5513937/

相关文章:

java - 键绑定(bind)和按住键

java - Eclipse 中的 "The public type <<classname>> must be defined in its own file"错误

java - JPA Web 应用程序管理策略

java - Hibernate 仅更新选定的列而不是所有修改的字段

java - 无法一次绘制多条线

java - 从中间结果初始化变量

apache - 绝对 uri : http://java. sun.com/jsp/jSTL/core 无法在 web.xml 或使用此应用程序部署的 jar 文件中解析

java - 野蝇中的 headless 异常

java - jackson 错误 : java. lang.NoClassDefFoundError: com/fasterxml/jackson/core/Versioned

jakarta-ee - @PrePassivate 和 @PostActivate 注释何时有用?