我在应用程序中有两个主要类。当我将它打包到一个可运行的jar(使用Eclipse导出函数)时,我必须选择一个默认的主类。
有没有办法在运行时从jar访问非默认主类?
答案 0 :(得分: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文件一侧的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();
}