我有一个问题,想要从一个JAR文件中运行多个不同的类。我知道可以将JAR文件中的一个类设置为主类,并在命令java -jar myjar.jar
后运行它,但我想要的是:
java -jar myjar.jar MyClass
我是否可以通过这种方式实现,还是必须创建多个JAR文件(每个文件对应一个可运行类),或者创建一个“管理器”类来运行我的其他类并向它们传递命令行参数?
我正在寻找文档或参考资料,但我找不到任何信息。
可执行的Jar文件格式只允许您指定一个主类。为了能够执行不同的应用程序,您需要创建一个“管理器”,或者使用classpath:
java -cp myjar.jar MyClass
然而,这种方法将会忽略您在Jar文件清单文件中配置的类路径。
你将需要使用:
java -cp myjar.jar MyClass
并且java -cp myjar.jar OtherMainClass
你是否更适合使用“启动器”主类,其功能仅是将调用分派给实际控制器类,并使用链接文件作为最终包装器,而不是在wm的-cp选项中摆弄?
在Windows中,这样做非常容易。
“主类”不需要太复杂,可以像这样:
/**
* Sample launcher
*/
public class Launcher {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
if (args != null && args.length > 0) {
String option= args[0];
String[] args2=new String[0];
if( args.length>1){
args2= new String[args.length-1];
System.arraycopy(args, 1, args2, 0, args2.length);
}
if(option.equals("a")) {
new ClassA().exec(args2);
}
else if(option.equals("b")){
new ClassB().exec(args2);
}
}
}
}
javaw.exe -jar "jarfile" "a"
java -cp myjar.jar MyClass
即将JAR文件放入类路径中,然后通过指定其完全限定名称运行任何具有main方法的类。 -jar
选项仅作为一种快捷方式存在,以使用JAR清单中的信息(该清单还可以包括类路径中的其他JAR以及指定主类)。
Jar文件在清单中只能包含一个Main-Class属性,这意味着java -jar myjar.jar
只能启动一个类。
您可以使用以下命令启动其他可运行的类:
java -cp myjar.jar OtherClass
由于已提供正确答案,您可以使用一种解决方案为每个主类构建具有不同清单的存根jar。这将允许您创建可运行的jar文件,并允许双击每个单独程序。
有几种实现方法,但基本原理是放置一个类类似于以下内容,用于调用预期的main方法并传递args。
package com.acme.myapp;
public final class Stub1 {
public static void main(String[] args) {
App1.main(args);
}
}
对于打包,使用Maven的一种方式是使用maven-assembly-plugin插件,并使用jar-with-dependencies Mojo。这里的优点是Mojo将为目标主方法构建一个自包含的Jar文件,不需要在类路径上拥有其他组合件。它通过将每个依赖Jar文件的内容复制到结果Jar文件中来实现这一点。