如何从独立的grails应用程序调用soap服务

时间:2013-01-15 14:32:59

标签: grails ejb glassfish-3 noclassdeffounderror

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

我尝试通过corba和wsdl连接两者,两种方式都无法初始化上下文(InitialContext),因为它说我运行时遇到了一些缺少的类(NoClassDefFoundError)应用程序(带有嵌入式jetty grails服务器)。我确信这个类应该在classpath中,因为我有一个包含它的jar,这个jar在classpath中,作为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.jarappserv-rt.jar(也是玻璃鱼罐子)添加到lib中,这样应用程序就会调用所有的玻璃鱼罐进入类路径但是这不起作用,我发现在独立的应用程序中应该手动添加包含类的jar(即使你在netbeans测试文件中添加了appserv-rt.jar并且工作了!)所以我将这个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

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

2 个答案:

答案 0 :(得分:0)

您已将auto-depends.jar添加到lib文件夹中。我想grails WAR文件应该看到它。但是为了使grails在run-app模式下使用该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复制到常春藤缓存中。然后运行你的应用程序 - 它应该加载jar。

答案 1 :(得分:0)

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

我创建了另一篇文章,其中详细介绍了我遇到的新问题。

How to access EJB services from a grails standalone client