2010-06-08 86 views
0

我创建了一个groovlet,它将充当一种HTTP代理。它接受GET请求,然后根据请求中提供的URL进行Web服务调用。Groovy servlet在Tomcat中找不到JAR文件

这里是到目前为止,我已经得到了代码:

@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.0') 
import groovyx.net.http.* 
import static groovyx.net.http.ContentType.* 
import static groovyx.net.http.Method.* 

String url = params.url 

def http = new HTTPBuilder(url) 

http.request(GET, TEXT) { 

    response.success = { resp, reader -> 
     println reader 
    } 

    response.'404' = { resp -> 
     println 'not found!' 
    } 
} 

我得在Groovlet中的WEB-INF/lib文件夹中的Groovy HTTPBuilder JAR文件。但是,代码不能正常工作。 (我也尝试将文件夹放在$TOMCAT_HOME/common/lib中,结果与下面相同。)

当我完全按照上面的方式运行代码时,页面会完全空白。

如果我只删除顶部的@Grab行(因为JAR理论上应该在类路径中),我从Tomcat中得到了一个令人讨厌的错误(我在5.5上运行它,但我得到的行为大致相同对6):

HTTP Status 500 - GroovyServlet Error: script: '/proxy.groovy': Script processing failed.startup failed: General error during semantic analysis: Type org.apache.http.client.methods.HttpRequestBase not present java.lang.TypeNotPresentException: Type org.apache.http.client.methods.HttpRequestBase not present...

然后是堆栈跟踪。

我的groovlet有什么问题?

回答

2

两件事。

首先,Groovlets似乎不能使用Grape(@Grab命令)。这就是为什么当这条线出现时,groovlet默默无闻的原因。

其次,http-builder模块也依赖于大约19个其他包(包括错误消息中引用的org.apache.http.client.methods.HttpRequestBase)。您可以在~/.groovy/grapes文件夹中找到这些软件包。

如果要查找所有依赖关系,请删除Grapes目录。然后在本地运行使用@Grab命令的脚本。脚本完成执行后,您可以查看Grapes目录并查看下载的所有内容。

当我做到了,我包的下面的列表:

antlr 
asm 
commons-beanutils 
commons-codec 
commons-collections 
commons-lang 
commons-logging 
net.sf.ezmorph 
net.sf.json-lib 
net.sourceforge.nekohtml 
org.apache 
org.apache.commons 
org.apache.httpcomponents 
org.codehaus.groovy 
org.codehaus.groovy.modules.http-builder 
xerces 

所以,如果你想使用HttpBuilder在Groovlet中,你需要获得在WEB-INF/lib中的所有这些依赖或Tomcat的common/lib目录。

另一方面,如果你不需要任何非常奇特的东西,你可以使用Groovy URL对象。见some examples here