【问题标题】:Selecting main class in a runnable jar at runtime在运行时选择可运行 jar 中的主类
【发布时间】:2011-01-02 16:04:48
【问题描述】:

我在应用中有两个主要课程。当我将它打包到一个可运行的 jar 中(使用 Eclipse 导出功能)时,我必须选择一个默认的主类。

有没有办法在运行时从 jar 中访问非默认主类?

【问题讨论】:

    标签: java jar executable-jar


    【解决方案1】:

    您可以通过java -cp myapp.jar com.example.Main1java -cp myapp.jar com.example.Main2 访问。当您通过java -jar myapp.jar 调用您的应用程序时,jar 中的默认主类。

    请参阅JAR_(file_format) 了解更多详情。当您在 Eclipse 中选择主类时,设置如下:Main-Class: myPrograms.MyClass 在 jar 清单内 META-INF/MANIFEST.MF 在 jar 文件一侧。

    【讨论】:

    • 这不适用于 Eclipse Runnable 导出,因为它们将加载委托给自定义类加载器。
    【解决方案2】:

    是的,这是可能的。您可以在每个类下添加另一个具有主方法的类,该方法根据参数执行所需的类/方法。

    例如

    public static void main(String... args) {
        if ("foo".equals(args[0])) {
            Foo.main(args);
        } else if ("bar".equals(args[0])) {
            Bar.main(args);
        }
     }
    

    (不要忘记自己添加明显的检查,例如args.length等)

    你可以使用如下:

    java -jar YourJar.jar foo
    

    如果设计得当,这会使其他类的main() 方法变得多余。例如

    public static void main(String... args) {
        if ("foo".equals(args[0])) {
            new Foo().execute();
        } else if ("bar".equals(args[0])) {
            new Bar().execute();
        }
     }
    

    为了更抽象(摆脱 if/else 块),您可以考虑让它们使用void execute() 实现一些Action 接口,并在Map 中获取它们:

    private static Map<String, Action> actions = new HashMap<String, Action>();
    static {
        actions.put("foo", new Foo());
        actions.put("bar", new Bar());
    }
    
    public static void main(String... args) {
        actions.get(args[0]).execute();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-22
      • 2012-01-27
      • 2018-08-03
      • 2013-06-30
      • 2020-05-05
      • 2020-07-28
      • 2020-10-18
      • 1970-01-01
      相关资源
      最近更新 更多