JAR中有多个runnable类,如何运行它们?

wlk*_*wlk 55 java jar

我在从一个JAR文件中运行多个不同的类时遇到问题.我知道我可以将JAR中的一个类设置为将在命令后运行的Main类java -jar myjar.jar,但我想要的是:

java -jar myjar.jar MyClass
Run Code Online (Sandbox Code Playgroud)

是否有可能以这种方式执行此操作,或者我是否必须创建多个JAR(每个用于一个可运行的类),或者更好地创建将运行我的其他类传递给命令行参数的"manager"类?
我正在寻找文档或参考,但我找不到任何.

igg*_*ran 70

可执行的Jar文件格式仅允许您指定一个主类.为了能够执行不同的应用程序,您需要按照建议创建"管理器",或者使用类路径:

java -cp myjar.jar MyClass
Run Code Online (Sandbox Code Playgroud)

但是,此方法将忽略您在Jar的清单文件中配置的类路径.

  • 这是因为这种形式的启动并不打算阅读清单.只有-jar表单才能读取清单. (3认同)

Gar*_*vis 13

你将不得不使用:

java -cp myjar.jar MyClass
Run Code Online (Sandbox Code Playgroud)

java -cp myjar.jar OtherMainClass
Run Code Online (Sandbox Code Playgroud)


小智 5

使用“Launcher”主类(其功能只是将调用分派到实际的控制器类)并使用链接文件作为最终包装器,而不是摆弄 -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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Windows 方面,创建此类链接就足够了

javaw.exe -jar "jarfile" "a"
Run Code Online (Sandbox Code Playgroud)

它对于将链接放置在“sendTo”文件夹中非常有用...一个隐藏的 jar,由激活其某一方面的许多链接调用,使得部署 jar 逻辑的更新变得更简单。

所选的实际文件作为链接定义中的参数后面的字符串列表传递。

这样,您就不必担心整个类路径问题。