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

如何从独立的grails应用程序调用soap服务,grails,ejb,glassfish-3,noclassdeffounderror,Grails,Ejb,Glassfish 3,Noclassdeffounderror,我提前道歉,因为英语不是我的母语。我在测试一个独立客户机(使用grails-groovy框架创建)时遇到了一些麻烦,该客户机与提供ejb服务的java服务器应用程序相连接 我试图通过corba和wsdl进行连接,但这两种方式都无法初始化上下文(InitialContext),因为当我运行我的应用程序(使用嵌入式jetty grails服务器)时,它说我缺少一些类(NoClassDefFoundError)。我确信这个类应该在类路径中,因为我有一个包含它的jar,而这个jar在类路径中,作为我的g

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

我试图通过corba和wsdl进行连接,但这两种方式都无法初始化上下文(
InitialContext
),因为当我运行我的应用程序(使用嵌入式jetty grails服务器)时,它说我缺少一些类(
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.jar
appserv-rt.jar
(也是glassfish jar)添加到lib中,这样应用程序就可以将所有glassfish jar调用到类路径中,但这不起作用,我发现在独立应用程序中,包含类的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.Residentiant


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

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

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

        runtime ':glassfish-auto-depends:1'

    }
    //.....
}
并将auto-dependens.jar重命名为glassfish-auto-dependens-1.jar(“1”是必需的版本;“glassfish”是为了方便起见)。其所有依赖项也应以类似方式指定。 然后执行以下命令:

grails refresh-dependencies

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

我通过将所有glassfish jar文件(库和模块)添加到我项目的库文件夹中,解决了这个问题,但调用服务时仍然有问题

我创建了另一个帖子,详细介绍了我遇到的新问题


Hi@eugene82。感谢您的快速响应,但它没有按预期工作,或者我做错了。我更改了所有jar的名称,使其包含其版本(如您在响应中所说),并将所有jar添加到
BuildConfig.groovy
。没有工作,我收到了相同的错误。还有其他想法吗??