Encontrando JAR à partir do nome da classe

Um problema que sempre atormentou minha vida foi tentar descobrir em qual JAR está uma determinada classe. Até o momento eu recorria ao http://www.findjar.comhttp://www.jarfinder.com/ ou Google. O problema é que nem sempre o JAR é encontrado ou está em versão errada. Para resolver esse tormento resolvi criar um programinha que consiste em buscar à partir de um caminho todos os arquivos JAR e procurar dentro dele à classe que eu quero.

Primeiro eu busco por arquivos JAR recursivamente:

	protected void searchForJars(File path, List<String> resultado) {

		for (File f : path.listFiles(filter)) {
			if (breakIfFound && found)
				return;

			if (f.isDirectory()) {
				searchForJars(f, resultado);
			} else {

				List<String> res = searchInsideJar(f);
				if (res != null) {
					resultado.addAll(res);
					found = true;
				}
			}

		}
	}

Se eu encontrar um arquivo JAR, eu busco dentro dele a informação que eu quero:

	protected List<String> searchInsideJar(File f) {
		List<String> resultado = null;
		try {
			JarFile jar = new JarFile(f);

			Enumeration<JarEntry> entries = jar.entries();

			while (entries.hasMoreElements()) {
				String entry = entries.nextElement().getName();
				if (entry.contains(classToFind)) {
					if (resultado == null) {
						resultado = new ArrayList<String>();
					}
					resultado.add(f.getPath() + ":" + entry);
					if (breakIfFound) {
						return resultado;
					}
				}
			}

		} catch (IOException e) {
			e.printStackTrace();
		}
		return resultado;
	}

Se eu encontrar algum arquivo que tenha a String que eu quero, adiciono o resultado numa lista. Para quem só precisa do utilitário, vou disponibizá-lo aqui. Para usar é necessário Java 7 e depois é só digitar:

 java -jar thiago-vespa-utils-classfinder.jar <CAMINHO> <CLASSE COMPLETA OU TRECHO> <BREAK>

Por exemplo:

 java -jar thiago-vespa-utils-classfinder.jar /opt/Oracle111150/Middleware/Oracle_SOA1/soa/modules Record

Ou

 java -jar thiago-vespa-utils-classfinder.jar /opt/Oracle111150/Middleware/Oracle_SOA1/soa/modules oracle.tip.adapter.api.record.RecordElement break

O break serve para informar que é para parar ao encontrar o primeiro. Se não digitar break ele vai encontrar todas as referências da classe especificada.

Sobre: Thiago Galbiatti Vespa

Thiago Galbiatti Vespa é mestre em Ciências da Computação e Matemática Computacional pela USP e bacharel em Ciências da Computação pela UNESP. Coordenador de projetos do JavaNoroeste, membro do JCP (Java Community Process), consultor Oracle, arquiteto de software de empresas de médio e grande porte, palestrante de vários eventos e colaborador de projetos open source. Possui as certificações: Oracle Certified Master, Java EE 5 Enterprise Architect – Step 1, 2 and 3; Oracle WebCenter Portal 11g Certified Implementation Specialist; Oracle Service Oriented Architecture Infrastructure Implementation Certified Expert; Oracle Certified Professional, Java EE 5 Web Services Developer; Oracle Certified Expert, NetBeans Integrated Development Environment 6.1 Programmer; Oracle Certified Professional, Java Programmer; Oracle Certified Associate, Java SE 5/SE 6