Kai said:
Is there a way to programmatically list all files or packages on the
classpath?
See the code below for some inspiration.
Arne
========================================
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class ClassFind {
public interface CallBack {
public boolean match(String clznam, String src);
public void process(String clznam, String src);
}
private void foundFile(String basedirnam, String fnm, CallBack cb) {
String clznam = fnm.substring(basedirnam.length()).replace('/',
'.').replace(".class", "");
if(cb.match(clznam, fnm)) {
cb.process(clznam, fnm);
}
}
private void findDir(String basedirnam, String dirnam, CallBack cb) {
File dir = new File(dirnam);
String[] dirlist = dir.list();
for(int i = 0; i < dirlist.length; i++) {
String fnm = dirnam + dirlist
;
if ((new File(fnm)).isDirectory()) {
findDir(basedirnam, fnm + "/", cb);
} else if(fnm.endsWith(".class")) {
foundFile(basedirnam, fnm, cb);
}
}
}
private void foundJar(String jarnam, String clznam, CallBack cb) {
if(cb.match(clznam, jarnam)) {
cb.process(clznam, jarnam);
}
}
private void findJar(String jarnam, CallBack cb) {
try {
JarFile jf = new JarFile(jarnam);
Enumeration<JarEntry> e = jf.entries();
while(e.hasMoreElements()) {
JarEntry je = e.nextElement();
String clznam = je.getName().replace('/', '.');
if(clznam.endsWith(".class")) {
foundJar(jarnam, clznam, cb);
}
}
} catch (IOException e) {
}
}
private void find(URL url, CallBack cb) {
if(url.getProtocol().equals("file")) {
String fnm = url.toExternalForm().replace("file:/", "");
File f = new File(fnm);
if(f.isDirectory()) {
findDir(fnm, fnm, cb);
} else {
findJar(fnm, cb);
}
}
}
public void find(CallBack cb) {
ClassLoader cl = ClassFind.class.getClassLoader();
while(cl != null) {
if(cl instanceof URLClassLoader) {
URL[] urls = ((URLClassLoader)cl).getURLs();
for(int i = 0; i < urls.length; i++) {
find(urls, cb);
}
}
cl = cl.getParent();
}
}
public static void main(String[] args) {
ClassFind cf = new ClassFind();
cf.find(new ClassFind.CallBack() {
public boolean match(String clznam, String src) {
return clznam.startsWith("dk.");
}
public void process(String clznam, String src) {
System.out.println(clznam + " in " + src);
}});
}
}