从 shell 开始,是否有 Java 工具来检查哪个已编译的 .class 文件具有 main 方法?
From shell, is there a Java tool to check which compiled .class file(s) have a main method?
我正在整理一些 (Python) 脚本来帮助我自动对数百个简单的学生 Java 回购进行评分。并非所有这些都具有相同的目录结构或文件命名。我已经遍历并编译了它们,如果我做出假设,我可以 运行 它们并测试它们,等等。但我想知道是否有办法找到“主要”。class 里面有 main()
方法,这样我就不必对他们的文件命名做出假设(无论如何这不会一直有效)。
我知道反射,所以是的,我知道我可以编写另一个简单的帮助程序 Java 来帮助我自己识别它。但我想知道是否已经存在任何东西(java
命令行选项、jdk 中的工具等)来测试 .class 文件以查看它是否具有 main()
里面的方法。
I was wondering if anything already exists (java command line option, tool from the JDK, etc.) to test a .class file to see if it is has the main() method in it.
Java SE 中没有工具或选项可以直接执行此操作。
I know I could write another simple helper Java program to assist me ...
编写一个 shell 脚本来迭代文件树,找到 .class
个文件,对它们调用 javap
,并使用适当的 main
方法签名。
或者您可以在源代码树上做类似的事情。
(回想起来,你应该设置作业要求,让学生必须使用指定的 class 和包含他们 main 方法的 class 的包名称。但为时已晚现在……)
好吧,如果 class 没有 main
方法,那么简单地调用 java -cp . <file>
要么完全失败,要么 运行 相关代码。现在,如果代码无法 运行 正确并且出现错误,您可能会认为它与没有 main
方法的效果相同。
public class HasMain {
public static void main(String[] args) {
System.out.println("Hit main");
}
}
public class HasDoIt {
public static void doIt(String[] args) {
System.out.println("Hit doIt");
}
}
public class WillBlowUp {
public static void main(String[] args) {
System.out.println("Hit blowUp");
throw new IllegalStateException("oops");
}
}
使用 PowerShell:
PS D:\Development\sandbox> javac HasMain.java
PS D:\Development\sandbox> javac HasDoIt.java
PS D:\Development\sandbox> javac WillBlowUp.java
PS D:\Development\sandbox> java -cp . HasMain
Hit main
PS D:\Development\sandbox> $?
True
PS D:\Development\sandbox> java -cp . HasDoIt
Error: Main method not found in class HasDoIt, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
PS D:\Development\sandbox> $?
False
PS D:\Development\sandbox> java -cp . WillBlowUp
Hit blowUp
Exception in thread "main" java.lang.IllegalStateException: oops
at WillBlowUp.main(WillBlowUp.java:4)
PS D:\Development\sandbox> $?
False
所以简单地检查 return 值可能是测试 class 是否有你想要的东西的快速方法,尽管任何 exit(1) 类型 return 都会抛出 false-false
在 C++ 时代,分发头文件以使用共享对象文件是一件大事。人们会在没有两者的情况下获得一个或另一个,并且您总是有机会获得 mis-matched 个版本。
Java 修复了 javap
打印已编译 .class
文件的方法(和其他主要接口)的问题。
测试 class 文件是否有主文件,运行
javap SomeFile.class
这将列出所有 public 接口。在该列表中,查看它是否具有“主入口点”
public static void main(java.lang.String[])
现在要批量处理此问题,只需创建一个 Python 脚本即可:
- 找到所有相关的 classes。
- 在 class 上运行
javap
。
- 读取匹配的方法的输出(在开头,因为结尾可能有可变数量的异常“public static void main(java.lang.String[])
你会找到所有入口点。
请记住,有时单个库或 JAR 文件有多个入口点,其中一些不是主要入口点。
我正在整理一些 (Python) 脚本来帮助我自动对数百个简单的学生 Java 回购进行评分。并非所有这些都具有相同的目录结构或文件命名。我已经遍历并编译了它们,如果我做出假设,我可以 运行 它们并测试它们,等等。但我想知道是否有办法找到“主要”。class 里面有 main()
方法,这样我就不必对他们的文件命名做出假设(无论如何这不会一直有效)。
我知道反射,所以是的,我知道我可以编写另一个简单的帮助程序 Java 来帮助我自己识别它。但我想知道是否已经存在任何东西(java
命令行选项、jdk 中的工具等)来测试 .class 文件以查看它是否具有 main()
里面的方法。
I was wondering if anything already exists (java command line option, tool from the JDK, etc.) to test a .class file to see if it is has the main() method in it.
Java SE 中没有工具或选项可以直接执行此操作。
I know I could write another simple helper Java program to assist me ...
编写一个 shell 脚本来迭代文件树,找到 .class
个文件,对它们调用 javap
,并使用适当的 main
方法签名。
或者您可以在源代码树上做类似的事情。
(回想起来,你应该设置作业要求,让学生必须使用指定的 class 和包含他们 main 方法的 class 的包名称。但为时已晚现在……)
好吧,如果 class 没有 main
方法,那么简单地调用 java -cp . <file>
要么完全失败,要么 运行 相关代码。现在,如果代码无法 运行 正确并且出现错误,您可能会认为它与没有 main
方法的效果相同。
public class HasMain {
public static void main(String[] args) {
System.out.println("Hit main");
}
}
public class HasDoIt {
public static void doIt(String[] args) {
System.out.println("Hit doIt");
}
}
public class WillBlowUp {
public static void main(String[] args) {
System.out.println("Hit blowUp");
throw new IllegalStateException("oops");
}
}
使用 PowerShell:
PS D:\Development\sandbox> javac HasMain.java
PS D:\Development\sandbox> javac HasDoIt.java
PS D:\Development\sandbox> javac WillBlowUp.java
PS D:\Development\sandbox> java -cp . HasMain
Hit main
PS D:\Development\sandbox> $?
True
PS D:\Development\sandbox> java -cp . HasDoIt
Error: Main method not found in class HasDoIt, please define the main method as:
public static void main(String[] args)
or a JavaFX application class must extend javafx.application.Application
PS D:\Development\sandbox> $?
False
PS D:\Development\sandbox> java -cp . WillBlowUp
Hit blowUp
Exception in thread "main" java.lang.IllegalStateException: oops
at WillBlowUp.main(WillBlowUp.java:4)
PS D:\Development\sandbox> $?
False
所以简单地检查 return 值可能是测试 class 是否有你想要的东西的快速方法,尽管任何 exit(1) 类型 return 都会抛出 false-false
在 C++ 时代,分发头文件以使用共享对象文件是一件大事。人们会在没有两者的情况下获得一个或另一个,并且您总是有机会获得 mis-matched 个版本。
Java 修复了 javap
打印已编译 .class
文件的方法(和其他主要接口)的问题。
测试 class 文件是否有主文件,运行
javap SomeFile.class
这将列出所有 public 接口。在该列表中,查看它是否具有“主入口点”
public static void main(java.lang.String[])
现在要批量处理此问题,只需创建一个 Python 脚本即可:
- 找到所有相关的 classes。
- 在 class 上运行
javap
。 - 读取匹配的方法的输出(在开头,因为结尾可能有可变数量的异常“public static void main(java.lang.String[])
你会找到所有入口点。
请记住,有时单个库或 JAR 文件有多个入口点,其中一些不是主要入口点。