Chi lavora con Java si sarà spesso imbattuto nella famigerata java.lang.ClassNotFoundException. Dopo le imprecazione del momento sorge spesso la necessita di scoprire in quale tra le decine di file jar nel classpath si annida questa benedetta classe. Ovviamente questo è solo un esempio di uno scenario in cui disporre di uno strumento in grado di ricercare ricorsivamente per nome una classe in svariati archivi jar può fare la differenza. Per chi lavora in ambiente Linux ho trovato una risposta qui e la ripropongo tradotta e più dettagliata nei passaggi.
Per prima cosa dobbiamo creare uno script bash che potete chiamare come vi pare (io l’ho chiamato findclass) e che va messo nel path (io ho scelto /usr/local/bin).
Da terminale spostiamoci in /usr/local/bin:
sudo touch findclass
sudo gedit findclass (o qualsiasi altro editor come vi va bene)
incollate dentro il file findclass le seguenti righe:
#!/bin/bash
# This is a program for finding a Class in a ton of jars
find . -name "*.jar" | xargs -i unzip -l {} | grep -E "^Archive:|$1" | less
Salvate e chiudete. Ora spostatevi nella directory in cui avete tutti i jar e provate da terminale a dare il comando appena creato. L’optput dovrebbe essere qualcosa tipo:
> findclass Enclosed
Archive: ./aspectj-1.5.3.jar
Archive: ./aspectjweaver.jar
Archive: ./junit.jar
651 27-03-07 14:22 org/junit/runners/Enclosed.class
Vale a dire che sono stati passati in rassegna tre archivi jar e la classe Enclosed è stata trovata in junit.jar. Il programma less, per uscire basta premere “q”.
Se per qualche ragione non vi trova il comando che avete creato (findclass) stampate il path a terminale:
echo $PATH
e controllate che il file creato sia all’interno di una delle directory riportate nel path.


