2

Glassfishv3でいくつかのEJBメソッドを呼び出すスタンドアロンクライアントを開発しています。これは、RCPアプリケーションで実行するためにクライアントをEclipseプラグインに統合するまではうまく機能します。この設定では、ネーミングコンテキストの初期化にクラスローダーの問題があるようで、以下の例外が発生します。(クライアントにはgf-client.jarと、そのクラスパスへのすべての依存関係があります。)

それは失敗します

m_ctx = new InitialContext();

例外を除いて

java.lang.NoSuchMethodException: org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findResources(java.lang.String)
            at java.lang.Class.getMethod(Class.java:1605)
            at com.sun.enterprise.module.single.ManifestProxy.<init>(ManifestProxy.java:34)
            at com.sun.enterprise.module.single.ProxyModuleDefinition.<init>(ProxyModuleDefinition.java:78)
            at com.sun.enterprise.module.single.ProxyModuleDefinition.<init>(ProxyModuleDefinition.java:73)
            at com.sun.enterprise.module.single.SingleModulesRegistry.<init>(SingleModulesRegistry.java:42)
            at com.sun.enterprise.module.single.SingleModulesRegistry.<init>(SingleModulesRegistry.java:30)
            at com.sun.enterprise.module.single.StaticModulesRegistry.<init>(StaticModulesRegistry.java:60)
            at org.glassfish.internal.api.Globals.getStaticHabitat(Globals.java:67)
            at com.sun.enterprise.naming.impl.SerialContext.<init>(SerialContext.java:183)
            at com.sun.enterprise.naming.impl.SerialContext.<init>(SerialContext.java:253)
            at com.sun.enterprise.naming.impl.SerialInitContextFactory.createInitialContext(SerialInitContextFactory.java:121)
            at com.sun.enterprise.naming.impl.SerialInitContextFactory.getInitialContext(SerialInitContextFactory.java:116)
            at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)
            at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
            at javax.naming.InitialContext.init(InitialContext.java:223)
            at javax.naming.InitialContext.<init>(InitialContext.java:175)

誰かがこの問題を解決する方法を考えていますか?

4

2 に答える 2

2

この問題をさらに調査した結果、Glassfishv3 は の public メソッドfindResources(java.lang.String)に依存していることがわかりましたjava.lang.Classloader

package com.sun.enterprise.module.single;
[...]
public class ManifestProxy extends Manifest {
    [...]    
    public ManifestProxy(ClassLoader cl, List<SeparatorMappings> mappings) throws IOException {
        try {
           [...]
            Method met = cl.getClass().getMethod("findResources", String.class);
            Enumeration<URL> urls=null;
            try {
                met.setAccessible(true);
                urls = (Enumeration<URL>) met.invoke(cl, JarFile.MANIFEST_NAME);

ただし、このメソッドは Classloader クラス自体で保護されています。sun.misc.Launcher$AppClassLoaderクライアントをスタンドアロン Java アプリケーションとして実行する場合、このメソッドをオーバーライドして public と宣言する派生クラスローダーが使用されます。しかし、Eclipse プラグインとして実行している場合、クラスローダーは-Method をorg.eclipse.osgi.internal.baseadaptor.DefaultClassLoaderオーバーライドせず、ManifestProxy クラスによって保護され、アクセスできないままになります。findResource

これを解決する最善の方法は何ですか? Eclipse プラグイン/OSGI バンドルに特定のクラスローダーを設定するにはどうすればよいですか?

ありがとう!

于 2010-01-25T14:00:03.270 に答える
0

適切なコンテキスト設定を使用していると思いますか?

    1. Properties props=new Properties();  
   2. props.setProperty("java.naming.factory.initial","com.sun.enterprise.naming.SerialInitContextFactory");  
   3. props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");  
   4. props.setProperty("org.omg.CORBA.ORBInitialPort","3700");  
于 2010-01-22T14:18:58.593 に答える