2

いくつかのアプリケーションをJBoss4からGlassFish3.1.xに移行しています。これらの各アプリケーションは、各アプリケーションが使用する共通のクラスとインターフェースを提供する同じAPIを使用します。それを呼びましょうCoreAPI.jar

CoreAPI.jarGlassFishのディレクトリに配置<domain>/libされ、共通のクラスローダーによってロードされます。

ここで、各アプリケーションが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

すべてのアプリケーション間でライブラリを共有するには、$GLASSFISH_HOME/glassfish/libフォルダを使用する必要があります。更新ツールを使用してGlassFishにアドオンをインストールすると、サードパーティのjarファイルがこのフォルダーにコピーされ、すべてのアプリで利用できるようになる場合があります。

ドメイン内のすべてのアプリケーションで共有するには$GLASSFISH_HOME/glassfish/domains/your-domain/lib、あなたが行ったように、それをフォルダに入れます。

あなたが説明したことをテストするために、私は2つのMavenプロジェクトを作成しました。

  • version(CoreAPIのモック)と呼ばれるJavaプロジェクト
  • web-version(CoreAPIを拡張する人)と呼ばれるWebプロジェクト

javaプロジェクトには、非抽象CoreAPIクラスとなるものが含まれています。

package com.acme.version;

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

Webバージョンのプロジェクトでは、提供されたスコープの依存関係をに追加してversion-1.0.jarコンパイルできるようにしますが、Glassfish/libフォルダーに存在するようになるとプロジェクトに追加されません。

次に、Webバージョンプロジェクトには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.0Webページに出力します。

デプロイされたアプリケーション内のサブクラスを共有ライブラリに「表示」させる方法はありますか?

共有ライブラリがロードされているので、少し奇妙です。何らかの理由であなたのサブクラスはそうではないようです。(ログに他の関連する例外はありますか?)

この問題は、サブクラス化やクラスローディングのアプローチではなく、JBossxGlassFishトランジションで発生した他の依存関係に関連している可能性があることを少し説明したと思います。

于 2012-05-23T22:18:33.430 に答える
1

デプロイされたアプリケーション内のサブクラスを共有ライブラリに「表示」させる方法はありますか?

いいえ。アプリケーションクラスローダーは一般的なクラスローダーの子孫であり、クラスローダーは親のみを表示でき、依存関係は表示できません。

Class.forName("com.app.ImplementationClass")これは通常、共通クラスが実際に共通ライブラリ内にあるコードのようなことを行おうとしたときに発見されます。

于 2012-05-23T22:46:03.537 に答える