【问题标题】:Programmatically find main() method in collection of classes以编程方式在类集合中查找 main() 方法
【发布时间】:2012-06-26 20:01:45
【问题描述】:

我正在开发一个项目,该项目需要获取任意数量的 java 文件,对其进行编译、打包,然后运行它们。我面临的问题是:我们跑哪个班?是否可以在一组类中找到入口点?

我愿意假设给定文件只有一个入口点。

这是我目前所考虑的:

  • 为每个使用反射查找带有 main() 的类的 jar 添加一个帮助类。要运行 jar,请调用该帮助程序类。
  • 将用户名设为他们的 main() 类“Main”,或类似的名称。

有什么好的方法可以解决这个问题吗?这个软件是为学生和新手程序员设计的,所以我愿意为了简单而牺牲健壮性。

谢谢!

【问题讨论】:

  • 你能让他们在 JAR 文件中提供清单吗?
  • 我想我可以。我只是犹豫要不要给系统增加任何复杂性。想想中学生。如果没有好的选择,我肯定会这样做。
  • 啊,我明白了。 Manifest 绝对是最好的方法,但是您在关于以某种方式命名他们的主类的问题中的建议也可能有助于您教他们约定与配置,这是一个有用的知识。
  • 这可能是很多工作,但很有趣。我会看看 Spring 如何进行组件扫描(从 org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#findCandidateComponents 开始),但我会寻找方法 main 而不是注释。他们使用 ASM 进行类解析。

标签: java class jar javac main


【解决方案1】:

我想到的一个想法可能是自定义注释。它比命名约定更健壮一点,但比创建清单文件更容易。

类似:

@MainClass
public class MyClass {
   public static void main(String [] args) {
      // ...
   }
}

您的工具可以扫描类以查找注释。

【讨论】:

  • 我会把这个想法升级为一个解决方案,你不会让学生写public static void main——无论如何,他们很可能不会处理命令行参数。设置任何公共无参数方法都可以用@EntryPoint 注释标记的要求,并编写您自己的、具有低级入口点的重用类(public static void main)。一个更简单的方法是对方法使用命名约定,因为使用注释会导致对 JAR 的依赖——另一个障碍。
  • 我想我会进一步追求马尔科的想法。谢谢!
【解决方案2】:

了解哪个类包含 main() 的最佳方法是在 JAR 文件中提供一个清单,该清单调用主类。

但是,您在关于以某种方式命名他们的主类的问题中的建议也可能有助于您教他们约定与配置,这是一个有用的知识。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    相关资源
    最近更新 更多