29

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

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

4

2 回答 2

44

您可以通过java -cp myapp.jar com.example.Main1和访问java -cp myapp.jar com.example.Main2。jar 中的默认主类用于当您通过java -jar myapp.jar.

有关详细信息,请参阅JAR_(file_format)。当您在 Eclipse 中选择主类时,这就是设置的内容:在jar 文件一侧的Main-Class: myPrograms.MyClassjar 清单内。META-INF/MANIFEST.MF

于 2010-01-07T20:49:44.090 回答
8

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

例如

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用 a 实现一些接口并void execute()在 a 中获取它们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();
}
于 2010-01-07T20:51:00.233 回答