代码之家  ›  专栏  ›  技术社区  ›  Tomasz

运行时在可运行jar中选择主类

  •  29
  • Tomasz  · 技术社区  · 16 年前

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

    有没有一种方法可以在运行时从JAR访问非默认的主类?

    2 回复  |  直到 16 年前
        1
  •  44
  •   Jeremy Raymond    16 年前

    您可以通过 java -cp myapp.jar com.example.Main1 java -cp myapp.jar com.example.Main2 . jar中的默认主类是用于通过 java -jar myapp.jar .

    参见 JAR_(file_format) 了解更多详细信息。当您在Eclipse中选择主类时,这是在中设置的: Main-Class: myPrograms.MyClass 在罐子清单中 META-INF/MANIFEST.MF 在JAR文件的一侧。

        2
  •  8
  •   BalusC    16 年前

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

    例如。

    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块),您可以考虑让它们实现一些 Action void execute() 把它们放在 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();
    }