2009-09-30 33 views
61

Questa deve essere una domanda molto semplice per gli sviluppatori Java, ma qual è il modo migliore per trovare il file jar appropriato dato un nome classe ?Trova un file jar con il nome della classe?

Ad esempio, dato "com.ibm.websphere.security.auth.WSSubject", come si rintraccia il file jar appropriato? ("google" non è la risposta che sto cercando!)

Gli java docs non danno alcun suggerimento sul file jar e ovviamente i nomi dei file jar non offrono alcun indizio.

Ci deve essere un 'search local jars', o una sorta di 'auto-risoluzione delle dipendenze', trucco nel mondo java. Idealmente, sto cercando il modo "ufficiale" per farlo. Mi capita di essere su una macchina Windows senza cygwin.

+0

Si sta tentando di risolvere una dipendenza? Ad esempio, quando si esegue il codice, non è possibile trovare una classe, quindi si sta cercando di inserirlo nel classpath? – aperkins

+0

Sì, è esattamente quello che sto cercando di fare. –

+0

Penso che tu stia facendo la domanda sbagliata. Penso che la domanda che intendi porre sia simile a "Sto cercando di sviluppare un'applicazione thin client utilizzando WAS v6.1 Quale jar dovrei includere nel mio percorso di classe JVM per eseguire l'autenticazione (presumibilmente WSSubject)?" A seconda di cosa stai effettivamente cercando di fare, cercare in InfoCenter "thin client" o "thin client wssubject" è probabilmente quello che stai cercando. Se fornisci i dettagli, puoi probabilmente ottenere il vaso corretto anziché solo indovinare in base alle risposte di seguito. –

risposta

74

Salvare questo come findclass.sh (o qualsiasi altra cosa), metterlo sul vostro percorso e renderlo eseguibile:

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

Il primo parametro è la directory per la ricerca in modo ricorsivo e il secondo parametro è un'espressione regolare (di solito solo un semplice nome di classe) per cercare per.

$ findclass.sh . WSSubject 

Lo script si basa su l'opzione -t per il comando jar (che elenca i contenuti) e greps ogni tabella dei contenuti, etichettatura eventuali corrispondenze con il percorso del file JAR in cui è stato trovato.

+0

Non sono sicuro che tu o Dave Costa abbiate risposto per primo, ma questo è il trucco e posso usare questo script in futuro. Grazie! –

+0

Dave ha risposto per primo.La sua risposta è più semplice e verrà eseguita più rapidamente, ma penso che la mia sia leggermente più flessibile in quanto non è necessario specificare il nome completo della classe. –

+1

Questo dovrebbe essere codificato Linux/Unix - nessun uso in Windows. – orbfish

3

Si potrebbe provare a servizi come:

O

O

  • con una funzione di ricerca per esempio Nexus (OFC, questo dovrebbe funzionare solo se i vasi che state cercando sono indicizzati cioè installati nel repository)

PS: Jarhoo ha fatto squadra con Javacio.us per fornire 100.000 sviluppatori Java con accesso gratuito a Jarhoo tramite link integrati con i risultati di ricerca di Google. L'iscrizione a Javacio.us è gratuita e aperta a chiunque disponga di un account Google. Per ulteriori informazioni, visitare il numero Jarhoo offer page at Javacio.us.

+0

- jarhoo costa denaro - docjar non trova "WSSubject" dal mio esempio (http://www.docjar.com/docs2web/s.jsp?q=WSSubject&t=q&start=0). Ci deve essere un approccio 'cerca barattoli locali' in genere utilizzato da java devs ..? –

+0

Sto sperando in un'opzione offline. Spesso mi trovo a trattare con barattoli un po 'oscuri di venditori di terze parti. –

+0

AFAIK, non c'è nulla di integrato in Windows che possa essere d'aiuto. Quindi, se escludi cygwin, Googke Desktop potrebbe essere l'opzione migliore (la meno peggiore?). –

0

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

+0

Buona risposta per * nix, ma non aiuta su Windows (anche se giudicare dal suo esempio * nix andrebbe bene). –

+0

Abbastanza corretto, ma qual è l'approccio standard per uno sviluppatore java su una macchina Windows che non prevede l'installazione di cygwin? –

+0

Trova nei file, * .jar, con la classe come stringa? (in realtà non so se funziona, ma se grep funziona, questo dovrebbe) – TREE

12

Non esiste un modo Java "ufficiale" per eseguire questo AFAIK.

Il modo in cui di solito cacciare per essa è di usare trovare e vaso di guardare attraverso tutti i file jar in un dato albero.

> 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 

Se siete su Windows e non si desidera installare Cygwin, quindi suppongo che si dovrebbe scrivere uno script batch per individuare i file jar.

+0

Nota che i file jar sono file zip e il nome file nel jar si associa effettivamente al pacchetto e alla classe. – TREE

+0

Mi piace di più perché non coinvolge grep –

2

Stampa la lista mentre procedo, così posso vedere cosa sto controllando. Principalmente sto cercando in una directory lib/app, ma puoi sostituire un localizzatore per la ricerca.

ad es.

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

Dato il tuo commento sul tentativo di gestire le dipendenze, quello che vorrei fare è concentrarsi su quali librerie si sta utilizzando. Sapendo questo, saprai quali barattoli devono essere sul classpath, e puoi prestare attenzione a questo. Ci sono anche builder di gestione delle dipendenze (Maven e Ant sono due popolari) che possono raggruppare progetti con le loro dipendenze all'interno. Tuttavia, alla fine, spetta allo sviluppatore sapere quali dipendenze hanno e prestare attenzione ai requisiti per tali dipendenze. Questo è uno dei motivi per cui l'utilizzo di un IDE come Eclipse e la creazione di strumenti come Maven o Ant sono così belli in progetti di grandi dimensioni, come quando si hanno 20 dipendenze per un progetto, che può diventare piuttosto ingestibile.

0

Si consiglia di utilizzare Maven, Eclipse e m2eclipse.

Fase 1 - aggiungere importazione specifico

alt text

Fase 2 - trovare e scaricare (automaticamente) desiderata vaso

alt text

3

In Windows, cmd.exe e il tipo gestito:

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

I vasi dovrebbero essere nella directory corrente. Inoltre ha un'opzione/R che prende una directory e ti permette di cercare ricorsivamente.

Se Jar.exe non è nel tuo percorso, puoi fare qualcosa come @C: \ jdk \ bin \ jar.exe.

5

Se il grep sul sistema (ad esempio Solaris) non ha -H e --label usati nell'esempio di Dan Dyer, è possibile utilizzare:

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

Prova findjar.com. Se è di dominio pubblico, dovresti farlo. C'è Alos mavenjava.com (ma quel sito sembra essere giù)

+0

C'è anche http://www.jarfinder.com. Ma entrambi sembrano offrire versioni piuttosto obsolete di barattoli. Conrast http://grepcode.com/ rimane aggiornato sul codice pubblico, ma può essere usato solo come suggerimento su dove cercare e qual è il vero nome del jar. – Vadzim

+0

Puoi anche provare http://javasearch.buggybread.com/ per trovare il framework che contiene la classe. –

14

ho scritto un programma per questo: https://github.com/javalite/jar-explorer Sarà anche decompilare il codice byte esistente visualizzare le interfacce, metodi, classi super mostrerà i contenuti del altre risorse: testo, immagini, html, ecc.

1

Io uso jarscan. È un file jar eseguibile che può cercare in modo ricorsivo un'intera struttura di cartelle per i jar che contengono la classe che si sta cercando. Cerca per nome classe, nome pacchetto o regex.

+0

Fare attenzione quando si inviano copia e incolla di risposte boilerplate/verbatim a più domande, che tendono ad essere contrassegnate come "spammy" dalla comunità. Se lo fai, in genere significa che le domande sono doppie, quindi contrassegnali come tali. – Kev

+0

per l'utilizzo con Windows, ho messo jarscan.jar in PATH insieme a jarscan.bat che contiene 'java -jar% ~ dp0jarscan.jar -class% 1% 2% 3% 4% 5% 6% 7% 8% 9' - quindi può essere utilizzato solo con "jarscan ServletRequest" – eis

5

Per cercare tutti i barattoli sotto la directory corrente e tornare quella (s) che contengono ABCD classe fanno un:

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

segnalerà tutte le istanze della classe ABCD (o classi con un suffisso simile) e stamperà solo i barattoli che lo contengono.

uscita tipico:

$ 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

se siete ancora alla ricerca di WSSubject, allora vaso è wssec.jar. Classe WSSecurityException all'interno di sas.jar

1

In Windows PowerShell è possibile utilizzare questo comando. Elenca tutti i file JAR che incontra, ma ha una linea in più che è molto facile individuare dove trova anche la tua classe.

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

Costruire sulla Dan's excellent answer, il seguente script risolve il problema della produzione maciullato nel caso in cui alcuni dei vasi sono collegamenti simbolici in realtà rotti (mentre allo stesso tempo non saltare i collegamenti simbolici propri) Si cerca anche nella directory corrente, se non argomento è fornito.

#!/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 
Problemi correlati