2010-01-07 53 views
28

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

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

回答

43

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

请参阅JAR_(file_format)了解更多详情。当你在Eclipse中选择主类时,这是在jar文件中的jar清单META-INF/MANIFEST.MF里设置的:Main-Class: myPrograms.MyClass

+0

这不会与Eclipse Runnable导出一起使用,因为它们将加载委托给自定义类加载器。 – 2012-04-23 01:14:32

+4

如果您具有Class-Path属性,则这不起作用 – 2012-11-12 21:00:13

8

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

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()方法变得多余。例如。

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