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

时间:2010-01-07 20:43:40

标签: java jar executable-jar

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

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

2 个答案:

答案 0 :(得分:44)

您可以通过java -cp myapp.jar com.example.Main1java -cp myapp.jar com.example.Main2访问这两者。 jar中的默认主类用于通过java -jar myapp.jar调用您的应用时。

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

答案 1 :(得分:8)

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

E.g。

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()方法变得多余。 E.g。

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();
}