我想要对一系列 JVM 进行一种最小的“冒烟测试”,范围包括 JDK 1 - 8、OpenJDK、IBM JDK,如果可能的话甚至是 Microsoft JDK。有没有办法制作一个最小的 Java 类文件来测试这个?

更新

应该可以运行:

java -cp 类名

并具有确认 JVM 正常运行的输出。

另外,对于那些认为 JVM 始终正常运行的人应该知道,我使用的系统在一台计算机上最多有 20 个 JVM,并且某些 JVM 可能会损坏。另请注意,并非所有 JVM 都可以运行所有 .class 文件

有帮助吗?

解决方案

krakatau有一个示例电子表文件用于最小的classfile。

.class public minimal
.super java/lang/Object
.

这将为您提供将在JVM中加载的最简单可能的类文件。它没有您通常来自其他工具的所有可选元数据(例如,jasmin始终添加sourcefile属性)。这不是最短的文件,因为你可以通过缩短类名来刮掉几个字节,但基本上是最简单的类。

请注意,虽然此类将加载,但它不包含任何代码,因此您无法有意义地执行它。如果您希望您可以运行的东西作为入口点,则需要添加一个主要功能。这可以通过调整 hello world 删除打印代码。

.class public Code
.super java/lang/Object

.method public static main : ([Ljava/lang/String;)V
    .limit stack 10
    .limit locals 10

    return
.end method
.

这将为您提供一个可运行的类,并立即返回。因此,它是具有主要功能的最简单的类。

其他提示

Java 兼容性工具包 (JCK) 正是为此目的而开发的。最小的 jar 不足以检查 JVM 实现的正确性,因为需要涵盖许多极端情况,并且需要支持字节码指令的任何组合。

如果您只是想检查一个最小程序是否运行,请编译一个带有空的简单类 main 版本 1 中转换为 Java 类文件格式的方法。由于 Java 的向后兼容性,任何 JVM 都应该可以理解这一点,并且 JVM 应该以状态代码退出 0.

具有主要方法的任何类都可以在任何JVM上执行,这可以是测试的最小案例,例如,例如:

class Hello {
    public static void main (String args[])
    {
        System.out.println("hello");
    }
}
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top