列出jar文件中的类

14

我该如何动态加载一个jar文件并列出其中的类?


22
对于像我这样的人,找到这个页面是因为想知道如何在命令行而不是通过Java列出jar中的类,答案是jar tf yourfile.jar。请注意保持原文意思和简洁性,不得添加解释或其他内容。 - Hnatt
1
@Hnatt 或者任何类似 7-zip 的 zip 阅读器(适用于 Windows),或者甚至 unzip -l yourfile.jar (适用于 *nix)都可以。 - Matthieu
5个回答

16

这是列出jar中类的代码:

import java.io.IOException;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class JarList {
    public static void main(String args[]) throws IOException {

        if (args.length > 0) {
            JarFile jarFile = new JarFile(args[0]);
            Enumeration allEntries = jarFile.entries();
            while (allEntries.hasMoreElements()) {
                JarEntry entry = (JarEntry) allEntries.nextElement();
                String name = entry.getName();
                System.out.println(name);
            }
        }
    }
}

15

您可以使用以下命令从命令提示符中查看JAR文件的内容:

jar tf jar-file

例如:

jar tf TicTacToe.jar


META-INF/MANIFEST.MF  
TicTacToe.class  
audio/  
audio/beep.au  
audio/ding.au  
audio/return.au  
audio/yahoo1.au  
audio/yahoo2.au  
images/  
images/cross.gif  
images/not.gif  

8

请查看java.util.jar包中的类。您可以在网上找到列出JAR文件内部文件的示例,这里是一个示例。(还要注意该页面底部的链接,有许多其他示例可向您展示如何使用JAR文件)。


非常感谢,".class"文件是类吗?我该如何将.class文件加载为类? - Hossein Margani
所以你想从JAR文件动态加载类?这比你最初要求的要多得多。也许这个问题包含了一些答案:https://dev59.com/onVC5IYBdhLWcg3wvT_g - Jesper

4

快速方式:只需将.jar文件作为.zip文件打开,例如在7-Zip中打开,并查找目录名称。


如果您的计算机上没有jar命令,或者不想为了这个检查而安装它,那么这种方法非常有效。 - Mor Paz

0

这里有一个版本,可以扫描给定的jar文件,查找所有继承特定类的非抽象类:

try (JarFile jf = new JarFile("/path/to/file.jar")) {
    for (Enumeration<JarEntry> en = jf.entries(); en.hasMoreElements(); ) {
        JarEntry e = en.nextElement();
        String name = e.getName();
        // Check for package or sub-package (you can change the test for *exact* package here)
        if (name.startsWith("my/specific/package/") && name.endsWith(".class")) {
            // Strip out ".class" and reformat path to package name
            String javaName = name.substring(0, name.lastIndexOf('.')).replace('/', '.');
            System.out.print("Checking "+javaName+" ... ");
            Class<?> cls;
            try {
                cls = Class.forName(javaName);
            } catch (ClassNotFoundException ex)  { // E.g. internal classes, ...
                continue;
            }
            if ((cls.getModifiers() & Modifier.ABSTRACT) != 0) { // Only instanciable classes
                System.out.println("(abstract)");
                continue;
            }
            if (!TheSuper.class.isAssignableFrom(cls)) { // Only subclasses of "TheSuper" class
                System.out.println("(not TheSuper)");
                continue;
            }
            // Found!
            System.out.println("OK");
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

当你知道你的 jars 存在哪里时,可以直接使用该代码。要获取该信息,请参考这个其他问题,因为自从 Java 9 和模块的引入以来,通过 classpath 的方式已经发生了变化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接