一些老的项目需要手动添加jar包。有些class报红找不到类,我们可以用这个工具类在特定的目录下查要找的class类,如果哪个jar包中有这个class名,会打印出来这个jar包的决对路径,然后我们把这个jar包手动添加到项目中。这样问题就解决了
java
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.io.IOException;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class SearchClassFromJar {
public static void main(String[] args) throws IOException {
// 遍历当前目录(D:\zttGithub\repo)及子目录中的所有 JAR 包
List<File> jarFiles = new ArrayList<>();
traverseDirectory(new File("D:\\zttGithub\\repo"), jarFiles);
findClass(jarFiles,"BinaryDecoder");
}
/**
* 查询特定目录下的所有jar包
* @param directory
* @param jarFiles
*/
private static void traverseDirectory(File directory, List<File> jarFiles) {
if (!directory.exists() || !directory.isDirectory()) {
return;
}
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile() && file.getName().endsWith(".jar")) {
jarFiles.add(file);
} else if (file.isDirectory()) {
traverseDirectory(file, jarFiles); // 递归遍历子目录
}
}
}
}
/**
* 查询ja包列表中是否有要寻找的findName的class存在
* @param jarFiles
* @param findName
* @throws IOException
*/
private static void findClass(List<File> jarFiles,String findName) throws IOException {
for (File jar : jarFiles) {
try (JarFile jarFile = new JarFile(jar.getAbsolutePath())) {
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.getName().endsWith(".class")) {
// 类名格式:com/example/MyClass.class
String className = entry.getName().replace("/", ".").replace(".class", "");
if(className.contains(findName)){
System.out.println("jar包名为:"+jar.getAbsolutePath()+",要找的类名为:"+className);
}
}
}
}
}
}
}
结果打印:
java
jar包名为:D:\zttGithub\repo\commons-codec\commons-codec\1.11\commons-codec-1.11.jar,要找的类名为:org.apache.commons.codec.BinaryDecoder
jar包名为:D:\zttGithub\repo\commons-codec\commons-codec\1.6\commons-codec-1.6.jar,要找的类名为:org.apache.commons.codec.BinaryDecoder