laredotornado wrote:
Hi,
I'm on Solaris 9. Does anyone know of a way to search through JAR
files (all of which are in the same directory) to find a class
"my.class" without having to unzip each file?
Thanks, - Dave
While on unix I will almost always use the shell, here is a quick and
dirty java based approach -
package net.abhijat.news.cl;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collection;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class ResourceFinder
{
private File dir ;
private ClassLoader classLoader ;
ResourceFinder(String dir) throws MalformedURLException
{
this.dir = new File(dir);
initSelf() ;
}
private void initSelf() throws MalformedURLException
{
FileFilter fileFilter = new filter();
File[] jarFiles = dir.listFiles(fileFilter);
URL[] jarURLs = new URL[jarFiles.length];
for (int i = 0; i < jarFiles.length; i++)
{
File jarFile = jarFiles[i];
jarURLs[i] = jarFile.toURL();
}
classLoader = new URLClassLoader(jarURLs, null);
}
public Collection<String> getJarsContainingClass(String fqClassname)
throws IOException
{
String resName = fqClassname.replace('.', '/')+".class";
Collection<String> jarFiles = new LinkedList<String>();
Enumeration<URL> urls = classLoader.getResources(resName);
while (urls.hasMoreElements())
{
URL url = urls.nextElement();
jarFiles.add(stringForm(url));
}
return jarFiles;
}
private static String stringForm(URL jarURL)
{
String jarPath = jarURL.toExternalForm();
StringTokenizer st = new StringTokenizer(jarPath, "!");
return st.nextToken();
}
class filter implements FileFilter
{
public boolean accept(File pathname)
{
if(pathname.isDirectory())
{
return false;
}
return pathname.getName().endsWith(".jar");
}
}
/**
* args[0] is the directory containing jars , args[1] is the fully
qualified classname
* @param args
*/
public static void main(String[] args)
{
try
{
String dir = args[0];
String clsName = args[1];
ResourceFinder finder = new ResourceFinder(dir);
Collection<String> urls = finder.getJarsContainingClass(clsName);
for (String url : urls)
{
System.out.println("[ResourceFinder::main()] "+url);
}
System.exit(0);
}
catch(Exception e)
{
e.printStackTrace();
System.exit(1);
}
}
}
I like JWhich better.
http://groups.google.com/group/comp.lang.java.programmer/browse_thread/thread/d3439526d8794dd6/51e2bcbc8d652c6b?hl=en&lnk=gst&q=jwhich#51e2bcbc8d652c6b
Sure, you can say it should be in classpath. But that's the point. You
one exactly you are using inside your Java environment.
Alex.