在运行时选择可运行JAR文件中的主类

29

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

是否有一种方法可以在运行时访问jar文件中的非默认主类?

2个回答

45

您可以通过 java -cp myapp.jar com.example.Main1java -cp myapp.jar com.example.Main2 两种方式访问。当您通过 java -jar myapp.jar 命令调用应用程序时,JAR包中的默认主类将会被执行。

详细信息请参阅JAR_(file_format)。在Eclipse中选择主类时,会在JAR清单文件 META-INF/MANIFEST.MF 中设置 Main-Class: myPrograms.MyClass


这不适用于Eclipse Runnable导出,因为它们将加载委托给自定义类加载器。 - Dominic Bou-Samra

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块),您可以考虑让它们实现一些带有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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接