Encontrar un archivo jar dado el nombre de la clase?

Esta debe ser una pregunta muy básica para los desarrolladores de Java, pero ¿cuál es la mejor manera de encontrar el archivo jar apropiado dado un nombre de clase ?

Por ejemplo, dado ” com.ibm.websphere.security.auth.WSSubject “, ¿cómo rastrear el archivo jar apropiado? (“google” no es la respuesta que estoy buscando!)

Los documentos de Java no dan ninguna pista del archivo jar, y obviamente los nombres de los archivos jar no ofrecen ninguna pista.

Debe haber una ‘búsqueda de jarras locales’, o algún tipo de ‘autodeterminación de dependencias‘, truco en el mundo de Java. Idealmente, estoy buscando la forma ‘oficial’ de hacer esto. Resulta que estoy en una máquina de Windows sin cygwin.

Guarde esto como findclass.sh (o lo que sea), póngalo en su ruta y hágalo ejecutable:

#!/bin/sh find "$1" -name "*.jar" -exec sh -c 'jar -tf {}|grep -H --label {} '$2'' \; 

El primer parámetro es el directorio para buscar recursivamente y el segundo parámetro es una expresión regular (por lo general, solo un nombre de clase simple) para buscar.

 $ findclass.sh . WSSubject 

La secuencia de comandos se basa en la opción -t al comando jar (que enumera los contenidos) y greps cada tabla de contenido, etiquetando las coincidencias con la ruta del archivo JAR en el que se encontró.

He escrito un progtwig para esto: https://github.com/javalite/jar-explorer También descomstackrá el código de bytes existente para mostrar las interfaces, los métodos, las súper clases, mostrará los contenidos de otros recursos – texto, imágenes, html , etc.

No hay una forma Java “oficial” para hacer esto AFAIK.

La forma en que generalmente lo busco es usar find y jar para examinar todos los archivos jar de un árbol determinado.

 > find . -name \*.jar -print -exec jar tf {} oracle/sql/BLOB.class \; ./v2.6.1/lib/csw_library.jar ./v2.6.1/lib/oracle_drivers_12_01.jar oracle/sql/BLOB.class 

Si está en Windows y no quiere instalar Cygwin, entonces supongo que tendrá que escribir un script por lotes para localizar los archivos jar.

Si grep en su sistema (por ejemplo, Solaris) no tiene -H y – etiqueta como se utiliza en el ejemplo de Dan Dyer, puede utilizar:

 find . -name '*.jar' -type f | xargs -i bash -c "jar -tvf {}| tr / . | grep WSSubject && echo {}" 

Para buscar todos los archivos jar bajo el directorio actual y devolver uno o más archivos que contengan la clase abcD, haga a:

 find . -iname *.jar | while read JARF; do jar tvf $JARF | grep a/b/c/D.class && echo $JARF ; done 

Informará todas las instancias de la clase abcD (o clases con un sufijo similar) y solo imprimirá los archivos jar que lo contengan.

Salida típica:

 $ find . -iname *.jar | while read JARF; do jar tvf $JARF | grep Log.class && echo $JARF ; done 479 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/Log.class 3714 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/Log4JCategoryLog.class 1963 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/NoOpLog.class 9065 Fri Oct 10 18:19:40 PDT 2003 org/apache/commons/logging/impl/SimpleLog.class ./WebContent/WEB-INF/lib/commons-logging.jar 

Podrías probar servicios como:

O

  • Google Desktop con el complemento IndexZip de Airbear Software

O

  • Un repository empresarial maven con una función de búsqueda, por ejemplo, Nexus (OFC, esto solo funcionaría si los flasks que está buscando están indexados, es decir, están instalados en el repository)

PD: Jarhoo se asoció con Javacio.us para proporcionar a 100.000 desarrolladores de Java acceso gratuito a Jarhoo a través de enlaces integrados con sus resultados de búsqueda de Google. La suscripción a Javacio.us es gratuita y está abierta a cualquier persona que tenga una cuenta de Google. Para obtener más información, visite la página de ofertas de Jarhoo en Javacio.us .

En Windows, ejecute cmd.exe y escriba:

  for %i in (*.jar) do @jar tvf %i | find "/com/company/MyClass.class" 

Los flasks deberían estar en el directorio actual. Para también tiene una opción / R que toma un directorio y le permite buscar recursivamente.

Si Jar.exe no está en su camino, puede hacer algo como @C: \ jdk \ bin \ jar.exe.

Prueba findjar.com. Si es de dominio público, deberías obtenerlo. También hay mavenjava.com (pero ese sitio parece estar abajo)

Imprimo la lista a medida que avanzo para poder ver lo que estoy comprobando. Principalmente estoy buscando en un directorio lib / app, pero puedes sustituirlo por uno para encontrarlo.

p.ej

 for jar in $(find some_dir/lib -name "*.jar" ); do echo -------------$jar------------------- jar -tf $jar | grep TheNameOfTheClassImLookingFor done 

Dado su comentario sobre el bash de manejar dependencias, lo que haría sería centrarme en las bibliotecas que está utilizando. Sabiendo esto, sabrá qué jarras deben estar en la ruta de clase, y puede prestar atención a eso. También hay constructores de administración de dependencias (Maven y Ant son dos populares) que pueden empaquetar proyectos con sus dependencias dentro. Sin embargo, al final, le corresponde al desarrollador saber qué dependencias tienen y prestar atención a los requisitos para esas dependencias. Esta es una de las razones por las que usar un IDE como Eclipse, y las herramientas de comstackción como Maven o Ant son tan agradables en proyectos grandes, como cuando tienes 20 dependencias para un proyecto, que pueden volverse bastante inmanejables.

Yo uso jarscan . Es un archivo jar ejecutable que puede buscar de forma recursiva una estructura de carpetas completa para jar que contenga la clase que está buscando. Busca por nombre de clase, nombre de paquete o regex.

En Windows PowerShell, puede usar este comando. Enumera todos los archivos JAR que encuentra, pero tiene una línea adicional que es muy fácil de detectar donde también encuentra su clase.

 Get-ChildItem -recurse -Filter *.jar | Foreach {echo $_.fullname; c:\somepath\JDK\BIN\jar tvf $_.fullname | Select-String -pattern "Cabbages.class"} 

También hay este sitio web que parece ser útil. http://www.findjar.com/

localizar .jar | xargs grep com.ibm.websphere.security.auth.WSSubject

si todavía está buscando WSSubject, jar es wssec.jar. Clase WSSecurityException dentro de sas.jar

Recomiendo usar Maven, Eclipse y m2eclipse.

Paso 1: agrega una importación específica

texto alternativo

Paso 2: encontrar y descargar (automáticamente) el archivo deseado

texto alternativo

Basándose en la excelente respuesta de Dan , la siguiente secuencia de comandos resuelve el problema del resultado dañado en caso de que algunos de los archivos jar estén realmente rotos (mientras que al mismo tiempo no omiten enlaces simbólicos). También busca en el directorio actual si no se proporciona ningún argumento.

 #!/usr/bin/env bash if [[ ($# -ne 1) && ($# -ne 2) ]] then echo "usage is $0  [ or, if missing, current dir]" else REG_EXP=$1 DIR=${2:-.} if [ ! -d $DIR ]; then echo "directory [$DIR] does not exist"; exit 1; fi find "$DIR" -name "*.jar" -exec sh -c ' (test -e {}) exitStatus=$? if [ "$exitStatus" -eq 0 ]; then # this is done to avoid broken symlinks jar -tf {}|grep -i -H --label {} '$REG_EXP' fi ' \; fi