0

我提前道歉,因为英语不是我的母语。我在测试与提供 ejb 服务的 java 服务器应用程序连接的独立客户端(使用 grails - groovy 框架创建)时遇到了一些麻烦。

我尝试通过 corba 和 wsdl 进行连接,两种方式都无法初始化上下文( ),因为它说我在运行我的应用程序(使用嵌入式 jetty grails 服务器)时InitialContext缺少一些类( )。NoClassDefFoundError我确信这个类应该在类路径中,因为我有一个包含它的 jar,并且这个 jar 在类路径中,作为我的 grails 应用程序的 lib 文件夹中的文件。

这就是我尝试初始化 bean 以调用服务的方式:

Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory")
p.setProperty("org.omg.CORBA.ORBInitialHost", iProperties.getINTEGRATION_IP())
p.setProperty("org.omg.CORBA.ORBInitialPort", iProperties.getCORBA_PORT())
try{
    ctx = new InitialContext(p)
    authWS = (AdmAuthenticationRemote) ctx.lookup(AUTHENTICATION_SERVICE_JNDI); // CORBA
} catch(Throwable e){
    ctx = new InitialContext(p)
    authenticationWS = (AdmAuthenticationRemote) ctx.lookup(REMOTE_CLASS_PACKAGE_NAME) // WSDL
}

上面的代码没有';' 因为 groovy 不需要它们来运行 java 代码。我在一个 netbeans 环境小应用程序中测试了这段代码,并且都有效。当我尝试在我的 grails 应用程序中执行此操作时,问题就出现了。

这是我尝试调用任何服务时遇到的错误:

NoClassDefFoundError: org/jvnet/hk2/component/MultiMap

当然这不是完整的堆栈,但这是问题原因(由堆栈引起)。此类 ( org.jvnet.hk2.component.MultiMap) 包含在文件中auto-depends.jar(来自 glassfish 的 jar)。我尝试将gf-client.jarand appserv-rt.jar(glassfish jars too) 添加到 lib 中,以便应用程序将所有 glassfish jars 调用到类路径中,但这不起作用,我发现在独立应用程序中包含类的 jars 应该手动添加(甚至你我只是appserv-rt.jar在 netbeans 测试文件中添加并工作!)所以我将此 jar 添加到我的 lib 文件夹中:

appclient.security.jar
auto-depends.jar
common-util.jar
config-api.jar
config.jar
config-types.jar
connectors-admin.jar
connectors-inbound-runtime.jar
connectors-internal-api.jar
connectors-runtime.jar
container-common.jar
deployment-common.jar
dol.jar
ejb-container.jar
ejb-internal-api.jar
ejb.security.jar
glassfish-api.jar
glassfish-corba-asm.jar
glassfish-corba-codegen.jar
glassfish-corba-csiv2-idl.jar
glassfish-corba-newtimer.jar
glassfish-corba-omgapi.jar
glassfish-corba-orbgeneric.jar
glassfish-corba-orb.jar
glassfish.jar
glassfish-naming.jar
gmbal.jar
hk2-core.jar
internal-api.jar
javax.ejb.jar
kernel.jar
management-api.jar
orb-connector.jar
orb-enabler.jar
orb-iiop.jar
security.jar
tiger-types-osgi.jar

当然,我也有带有远程接口和服务对象的 jar,我需要访问 glassfish 服务器中的服务。即使我这样做,这个错误也会不断发生。我没有想法,被这个问题困在这里,不知道如何解决它。我的问题是如何解决这个异常?是grails的问题吗??我没有配置一些 grails 文件吗?请任何想法将不胜感激。

提前致谢

凯文

更新:我也发现,如果我运行 clean 和 compile 命令,我会得到这个错误而不是之前的错误:

java.lang.ClassNotFoundException: org.jvnet.hk2.component.Inhabitant

我不确定为什么会发生这种情况,但是当我重新启动服务器(没有干净编译)时,它给出了以前的错误。

4

2 回答 2

0

您将 auto-depends.jar 添加到 lib 文件夹。我想 grails WAR 文件应该看到它。但是要让 grails 在运行应用程序模式下使用该 jar,您可能还需要注册依赖项。在 BuildConfig.groovy 中添加以下行:

grails.project.dependency.resolution = {
    //.....
    dependencies {
        //.....

        runtime ':glassfish-auto-depends:1'

    }
    //.....
}

并将您的 auto-depends.jar 重命名为 glassfish-auto-depends-1.jar(“-1”是必需的版本;“glassfish”是为了方便起见)。它的所有依赖项也应该类似地指定。然后执行命令:

grails refresh-dependencies

它会将 jar 复制到 ivy 缓存。然后运行您的应用程序 - 它应该加载 jar。

于 2013-01-16T10:04:12.193 回答
0

我设法通过将所有 glassfish jar 文件(lib 和模块)添加到我的项目的 lib 文件夹来解决他的问题,但是我在调​​用服务时仍然遇到问题。

我创建了另一个帖子,详细说明了我遇到的新问题。

如何从 Grails 独立客户端访问 EJB 服务

于 2013-01-23T18:40:39.537 回答