Groovy Servlet não consegue encontrar arquivos jar no tomcat
-
25-09-2019 - |
Pergunta
Eu criei um groovlet que atuará como uma espécie de proxy HTTP. Ele aceita solicitações GET e faz chamadas de serviço da Web com base na URL fornecida na solicitação.
Aqui está o código que tenho até agora:
@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!'
}
}
Eu tenho o Groovy httpbuilder Arquivo jar no WEB-INF/lib
pasta do groovlet. No entanto, o código não está funcionando como deveria. (Eu também tentei colocar a pasta em $TOMCAT_HOME/common/lib
com os mesmos resultados abaixo.)
Quando eu executo o código exatamente como está acima, a página volta completamente em branco.
Se eu remover apenas o @Grab
Linha no topo (já que o frasco deve estar teoricamente no caminho de classe), recebo um erro desagradável do tomcat (estou executando no 5.5, mas recebo aproximadamente o mesmo comportamento em 6):
Status HTTP 500 - Erro de groovyServlet: script: '/proxy.groovy': processamento de scripts falhas.STARTUP Falha: erro geral durante a análise semântica: type org.apache.http.client.methods.httprequestbase não presente org.apache.http.client.methods.httprequestbase não presente ...
Isso é seguido pelo rastreamento da pilha.
O que há de errado com meu groovlet?
Solução
Duas coisas.
Primeiro, parece que os groovlets não podem usar uva (o @Grab
comando). É por isso que o groovlet falha silenciosamente quando essa linha está presente.
Segundo, o http-builder
O módulo também depende de cerca de 19 outros pacotes (incluindo o org.apache.http.client.methods.HttpRequestBase
que é referenciado na mensagem de erro). Você pode encontrar esses pacotes no ~/.groovy/grapes
pasta.
Se você deseja encontrar todas as dependências, exclua o diretório uvas. Em seguida, execute um script localmente que use isso @Grab
comando. Depois que o script terminar de executar, você pode procurar no diretório uvas e ver tudo o que baixou.
Quando fiz isso, recebi a seguinte lista de pacotes:
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
Portanto, se você deseja usar o HttpBuilder em um groovlet, precisará obter todas essas dependências no Web-Inf/Lib ou no seu diretório Tomcat Common/Lib.
Por outro lado, se você não precisar de nada terrivelmente chique, pode usar o objeto URL groovy. Ver Alguns exemplos aqui.