miércoles, 15 de octubre de 2008

Buscando una clase entre decenas de librerias JAR

Todas las personas que llevamos un tiempo usando UNIX, conocemos la potencia de 'find' a la hora de buscar ficheros que cumplan ciertas caracteristicas y opcionalmente ejecutar operaciones sobre ellos.

En ocasiones, trabajando con Java, necesitamos encontrar una clase determinada, pero todo lo que tenemos para buscar es un directorio con decenas de librerias, pero no tenemos la menor idea de cual de las librerias contiene la clase en cuestion.

Una opcion es utilizar una instruccion de este tipo:

$ find . -name "*.jar" -exec jar tvf {} \; grep -i Logger

Este tipo de instrucciones, como mucho te puede decir si una clase se encuentra dentro de alguna de las librerias, pero lo que no te puede decir es en que libreria esta.

¿Como se soluciona esto?

Lo mas sencillo es crear una pequeña shell script como esta:

echo $1
jar tvf $1 grep -i $2


Si grabamos esta shell script por ejemplo en /tmp, podemos invocarla asi:

$ find . -name "*.jar" -exec /tmp/shell.sh {} Logger \;

De esta manera, la ejecución anterior nos daría esta salida, donde vemos que la clase Logger se encuentra bajo log4j.jar:

SDPM/lib/log4j.jar
Sep 14 2006 org/apache/log4j/Logger.class
Sep 14 2006 org/.../LoggerDynamicMBean.class
Sep 14 2006 org/.../log4j/spi/LoggerFactory.class
Sep 14 2006 org/.../spi/LoggerRepository.class
Sep 14 2006 org/apache/log4j/spi/RootLogger.class
SDPM/lib/tomcat-5.5.23/jsp-api.jar
SDPM/lib/tomcat-5.5.23/servlet-api.jar
SDPM/lib/vap 7.3/portlet.jar
SDPM_ALUI/lib/commons-beanutils.jar
SDPM_ALUI/lib/commons-collections.jar
SDPM_ALUI/lib/commons-digester-1.5.jar
SDPM_ALUI/lib/commons-logging.jar

No hay comentarios: