Groovy servlet non riesce a trovare i file JAR in Tomcat
-
25-09-2019 - |
Domanda
Ho creato un groovlet che agirà come una sorta di proxy HTTP. Accetta richieste GET e poi fa le chiamate di servizio web in base l'URL fornito nella richiesta.
Ecco il codice che ho finora:
@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!'
}
}
Ho il Groovy HTTPBuilder file JAR nella cartella WEB-INF/lib
di il groovlet. Tuttavia, il codice non funziona come dovrebbe. (Ho anche provato a mettere la cartella in $TOMCAT_HOME/common/lib
con gli stessi risultati qui sotto.)
Quando eseguo il codice esattamente come è al di sopra, la pagina ritorna completamente in bianco.
Se rimuovo solo la linea @Grab
in alto (dal momento che il JAR dovrebbe essere teoricamente già classpath), ottengo un errore di brutto da Tomcat (sto correndo su 5.5, ma ottengo più o meno lo stesso comportamento su 6):
HTTP Stato 500 - GroovyServlet errore: script: '/proxy.groovy': Script elaborazione failed.startup non riuscita: Errore generale durante la semantica Analisi: Tipo org.apache.http.client.methods.HttpRequestBase non presente java.lang.TypeNotPresentException: genere org.apache.http.client.methods.HttpRequestBase non presente ...
Questo è seguito da l'analisi dello stack.
Cosa c'è di sbagliato con il mio groovlet?
Soluzione
Due cose.
In primo luogo, sembra che Groovlets non possono utilizzare Uva (il comando @Grab
). Ecco perché il groovlet fallisce silenziosamente quando questa riga è presente.
In secondo luogo, il modulo http-builder
dipende anche da circa 19 altri pacchetti (tra cui il org.apache.http.client.methods.HttpRequestBase
cui viene fatto riferimento nel messaggio di errore). È possibile trovare questi pacchetti nella cartella ~/.groovy/grapes
.
Se si desidera trovare tutte le dipendenze, cancellare la directory Uva. Poi eseguire uno script locale che utilizzi quel comando @Grab
. Una volta che lo script ha terminato l'esecuzione, si può guardare nella directory di uve e vedere tutto ciò che hanno scaricato.
Quando l'ho fatto, ho avuto il seguente elenco di pacchetti:
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
Quindi, se si desidera utilizzare HttpBuilder in un groovlet, avrete bisogno di ottenere tutte quelle dipendenze in WEB-INF / lib o la vostra directory comune / lib Tomcat.
D'altra parte, se non hai bisogno di niente terribilmente di fantasia, è possibile utilizzare l'oggetto Groovy URL. Vedere alcuni esempi qui .