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

Tom*_*asz 29 java jar executable-jar

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

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

Jer*_*ond 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.MyClass的jar清单内部META-INF/MANIFEST.MF.

  • 如果您具有Class-Path属性,则此方法无效 (4认同)

Bal*_*usC 8

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

例如

public static void main(String... args) {
    if ("foo".equals(args[0])) {
        Foo.main(args);
    } else if ("bar".equals(args[0])) {
        Bar.main(args);
    }
 }
Run Code Online (Sandbox Code Playgroud)

(别忘了自己添加明显的检查args.length等等)

你可以使用如下:

java -jar YourJar.jar foo
Run Code Online (Sandbox Code Playgroud)

如果设计得很好,这可能会使main()其他类的方法变得多余.例如

public static void main(String... args) {
    if ("foo".equals(args[0])) {
        new Foo().execute();
    } else if ("bar".equals(args[0])) {
        new Bar().execute();
    }
 }
Run Code Online (Sandbox Code Playgroud)

为了更多地抽象(去掉if/else块),你可以考虑让它们Action用a 实现一些接口并在下面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();
}
Run Code Online (Sandbox Code Playgroud)