2

我正在将几个应用程序从 JBoss 4 迁移到 GlassFish 3.1.x。这些应用程序中的每一个都使用相同的 API,该 API 提供了每个应用程序使用的公共类和接口。让我们称之为CoreAPI.jar

CoreAPI.jar放到<domain>/libGlassFish的目录下,由通用类加载器加载。

现在假设每个应用程序都从 CoreAPI 扩展了一个类(不是抽象的),称为Version

public class Version {
    public String getVersion() { return null; }
}

该方法getVersion()在 API 本身的多个位置调用,每个使用 API 的应用程序负责扩展类并提供如下版本:

public class MyAppVersion extends Version {
    private static final String VERSION = "1.0";

    @Override
    public String getVersion() { return VERSION; }
}

当我将应用程序部署到捆绑在 WAR 或 EAR 中的 GlassFish 时,无论何时getVersion()从父类调用 API,我都会得到一个java.lang.NullPointerException- 它似乎找不到子类。

CoreAPI.jar如果与 WAR 捆绑在一起并从目录中删除,则可以正确找到子类<domain>/lib,但我不能这样做,因为许多应用程序需要它作为共享库。

有没有办法让共享库“看到”已部署应用程序中的子类?

谢谢!

澄清: 我无权更改 CoreAPI

4

2 回答 2

1

有没有办法让共享库“看到”已部署应用程序中的子类?

不可以。应用程序类加载器是普通类加载器的后代,类加载器只能看到它们的父类,而不能看到它们的依赖项。

这通常是在公共类尝试Class.forName("com.app.ImplementationClass")在实际位于公共库中的代码中执行类似操作时发现的。

于 2012-05-23T22:46:03.537 回答
1

为了在所有应用程序之间共享库,您应该使用该$GLASSFISH_HOME/glassfish/lib文件夹。当您通过更新工具将附加组件安装到 GlassFish 时,您甚至可能会注意到它会将第三方 jars 复制到此文件夹,以便所有应用程序都可以使用它。

要共享域下的所有应用程序,您可以将其放入$GLASSFISH_HOME/glassfish/domains/your-domain/lib文件夹中,就像您所做的那样。

为了测试您所描述的内容,我创建了 2 个 Maven 项目:

  • 一个名为 version 的 java 项目(CoreAPI 的模拟)
  • 一个名为 web-version 的 web 项目(将扩展 CoreAPI 的人)

java项目包含你的非抽象CoreAPI类:

package com.acme.version;

public class Version
{
    public String getVersion() { return null; }
}

在 web 版本的项目中,我添加了一个提供的范围依赖项,version-1.0.jar因此它可以被编译,但是一旦它出现在 Glassfish /lib 文件夹中,它就不会被添加到项目中。

然后 web-version 项目具有Version我用于测试的类的扩展版本:

package com.acme.web.controller;

import com.acme.version.Version;

public class ExtendedVersion extends Version
{
    private static final String VERSION = "1.0";

    @Override
    public String getVersion ()
    {
        return VERSION;
    }

    @Override
    public String toString()
    {
        return getVersion();
    }
}

然后我这样做了:

  • 构建版本项目并将生成的 jar 复制到上述$GLASSFISH_HOME/glassfish/lib 文件夹中。

  • 创建了一个包含ExtendedVersion实例的控制器并部署了应用程序。它1.0在网页中输出。

有没有办法让共享库“看到”已部署应用程序中的子类?

好吧,这有点奇怪,因为正在加载共享库。似乎由于某种原因您的子类不是。(日志中是否还有其他相关异常?)

我认为根据您的描述,这个问题甚至可能与您在 JBoss x GlassFish 转换中的其他依赖关系有关,而不是与您的子类化或类加载方法有关。

于 2012-05-23T22:18:33.430 回答