2009-09-30 15 views
61

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 ?¿Encontrar un archivo jar dado el 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!)

El java docs no da 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 'auto-resolver dependencias', truco en el mundo java. Idealmente, estoy buscando la forma 'oficial' de hacer esto. Resulta que estoy en una máquina de Windows sin cygwin.

+0

¿Está intentando resolver una dependencia? es decir, cuando ejecuta su código, no puede encontrar una clase, por lo que está buscando ponerlo en el classpath? – aperkins

+0

Sí, eso es exactamente lo que intento hacer. –

+0

Creo que estás haciendo la pregunta incorrecta. Creo que la pregunta que pretende hacer es algo así como "Estoy tratando de desarrollar una aplicación Thin Client utilizando WAS v6.1. ¿Qué jar debería incluir en mi ruta de clase JVM para realizar la autenticación (presumiblemente WSSubject)?" Dependiendo de lo que realmente está tratando de hacer, es probable que busque en InfoCenter "thin client" o "thin client wssubject" lo que está buscando. Si proporciona detalles, probablemente pueda obtener el archivo correcto en lugar de simplemente adivinar en función de las respuestas a continuación. –

Respuesta

74

Guárdelo como findclass.sh (o lo que sea), lo puso en su camino y hacerlo ejecutable:

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

El primer parámetro es el directorio de búsqueda de forma recursiva y el segundo parámetro es una expresión regular (por lo general sólo un nombre clase simple) para buscar para.

$ findclass.sh . WSSubject 

El guión se basa en la opción -t para el comando jar (que enumera el contenido) y GREPS cada tabla de contenidos, el etiquetado de cualquier coincidencia con la ruta del archivo JAR en el que se encontró.

+0

No estoy seguro si usted o Dave Costa respondieron primero, pero esto funciona y puedo usar este script en el futuro. ¡Gracias! –

+0

Dave respondió primero.Su respuesta es más simple y se ejecutará más rápido, pero creo que la mía es un poco más flexible ya que no tiene que especificar el nombre de clase totalmente calificado. –

+1

Esto debe etiquetarse como Linux/Unix, sin uso en Windows. – orbfish

3

Usted podría tratar de servicios como:

O

O

  • Un repositorio de empresa experta con una función de búsqueda, por ejemplo, Nexus (OFC, esto sólo funcionaría si los frascos que está buscando son indexados es decir, instalado en el repositorio)

PS: Jarhoo se ha asociado con Javacio.us para proporcionar 100.000 desarrolladores de Java con acceso libre 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 el Jarhoo offer page at Javacio.us.

+0

- jarhoo cuesta dinero - docjar no encuentra "WSSubject" de mi ejemplo (http://www.docjar.com/docs2web/s.jsp?q=WSSubject&t=q&start=0). Debe haber un enfoque de 'búsqueda de jarras locales' utilizado normalmente por desarrolladores java ..? –

+0

Estoy esperando una opción fuera de línea. A menudo me encuentro lidiando con tarros algo oscuros de proveedores de terceros. –

+0

AFAIK, no hay nada incorporado en Windows que pueda ayudarlo. Entonces, si excluye cygwin, Googke Desktop puede ser la mejor opción (¿la menos importante?). –

0

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

+0

Buena respuesta para * nix, pero no ayuda en Windows (aunque a juzgar por su ejemplo * nix estaría bien). –

+0

Lo suficiente, pero ¿cuál es el enfoque estándar para un desarrollador de Java en una máquina de Windows que no implica la instalación de cygwin? –

+0

Buscar en archivos, * .jar, con la clase como la cadena? (en realidad no sé si esto funciona, pero si grep funciona, esto debería) – TREE

12

No hay una forma "oficial" de Java para hacer este AFAIK.

La forma en que suelen cazar para ello es utilizar encontrar y frasco a mirar a través de todos los archivos jar en un árbol dado.

> 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ás en Windows y no desea instalar Cygwin, entonces supongo que tendría que escribir un script por lotes para localizar los archivos jar.

+0

Tenga en cuenta que los archivos jar son archivos zip, y el nombre del archivo en el jar se correlaciona efectivamente con el paquete y la clase. – TREE

+0

Me gusta más porque no involucra grep –

2

Imprimiendo la lista sobre la marcha para que pueda 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 
1

Teniendo en cuenta sus comentarios sobre el intento de manejar dependencias, lo que haría es centrarse en qué librerías 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 compilación como Maven o Ant son tan agradables en proyectos grandes, como cuando tienes 20 dependencias para un proyecto, que pueden volverse bastante inmanejables.

0

Recomiendo usar Maven, Eclipse y m2eclipse.

Paso 1 - añadir importación específica

alt text

Paso 2 - encontrar y descargar (automáticamente) deseada frasco

alt text

3

En Windows, cmd.exe y tipo ejecute:

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

Los frascos 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.

5

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

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

Trate findjar.com. Si es de dominio público, deberías obtenerlo. Hay alos mavenjava.com (pero ese sitio parece estar abajo)

+0

También hay http://www.jarfinder.com. Pero ambos parecen ofrecer versiones bastante obsoletas de jarras. En contraste, http://grepcode.com/ se mantiene actualizado en el código público, pero solo se puede usar como una pista sobre dónde buscar y cuál es el nombre real del jar. – Vadzim

+0

Incluso puedes probar http://javasearch.buggybread.com/ para encontrar el marco que contiene la clase. –

14

he escrito un programa para esto: https://github.com/javalite/jar-explorer También descompilar el código de bytes existente para mostrar las interfaces, métodos, clases súper, se mostrará el contenido de otros recursos - texto, imágenes, html, etc.

1

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.

+0

Tenga cuidado al publicar copiar y pegar las respuestas al pie de página o verbatim a preguntas múltiples, estas tienden a ser señaladas como "spam" por la comunidad. Si está haciendo esto, generalmente significa que las preguntas son duplicadas, por lo tanto, márquelas como tales. – Kev

+0

para usar con windows, puse jarscan.jar en PATH junto con jarscan.bat que contiene 'java -jar% ~ dp0jarscan.jar -class% 1% 2% 3% 4% 5% 6% 7% 8% 9' - entonces puede usarse solo con "ServletRequest de jarscan" – eis

5

para buscar todas las jarras en el directorio actual y regresar la (s) que contienen ABCD clase hacen un:

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

Se informará todas las instancias de la clase ABCD (o clases con un sufijo similar) y solo imprimirá los frascos que lo contienen.

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 
1

si todavía está en busca de WSSubject, entonces frasco es wssec.jar. Clase WSSecurityException dentro de sas.jar

1

En Windows PowerShell, puede utilizar 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"} 
0

acumule en Dan's excellent answer, el siguiente script resuelve el problema de la salida mutilado en el caso de algunos de los frascos son enlaces simbólicos en realidad rotos (mientras que al mismo tiempo no saltarse los enlaces simbólicos apropiados) También busca en el directorio actual si no hay argumento es provisto

#!/usr/bin/env bash 

if [[ ($# -ne 1) && ($# -ne 2) ]] 
then 
    echo "usage is $0 <grep RegEx to look for in contents of jar> [<top-of-folder-hierarchy> 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 
Cuestiones relacionadas