簡體   English   中英

JAR中有多個runnable類,如何運行它們?

[英]Multiple runnable classes inside JAR, how to run them?

我在從一個JAR文件中運行多個不同的類時遇到問題。 我知道我可以將JAR中的一個類設置為將在命令java -jar myjar.jar之后運行的Main類,但我想要的是:

java -jar myjar.jar MyClass

是否有可能以這種方式執行此操作,或者我是否必須創建多個JAR(每個用於一個可運行的類),或者更好地創建將運行我的其他類傳遞給命令行參數的“manager”類?
我正在尋找文檔或參考,但我找不到任何。

可執行的Jar文件格式僅允許您指定一個主類。 為了能夠執行不同的應用程序,您需要按照建議創建“管理器”,或者使用類路徑:

java -cp myjar.jar MyClass

但是,此方法將忽略您在Jar的清單文件中配置的類路徑。

你將不得不使用:

java -cp myjar.jar MyClass

java -cp myjar.jar OtherMainClass

你這樣做:

java -cp myjar.jar MyClass

即將JAR放入類路徑中,然后可以通過指定其完全限定名稱來運行具有main方法的任何類。 -jar選項僅作為使用JAR清單中的信息的快捷方式存在(它還可以包括類路徑中的其他JAR以及指定主類)。

由於已經提供了正確答案,因此可以使用一種解決方案為每個具有不同清單的主類構建存根jar。 這將允許您通過允許雙擊每個單獨的程序來創建可運行的jar文件。

有幾種方法可以實現這一點,但基本的是將一個類似於下面的類調用傳遞args的預期main方法。

package com.acme.myapp;

public final class Stub1 {
    public static void main(String[] args) {
        App1.main(args);
    }
}

至於打包這個,使用maven的一種方法是使用maven -assembly-pluginjar-with-dependencies mojo。 這里的優點是mojo將為自包含的目標main方法構建一個jar,並且不需要在類路徑上有其他程序集。 它通過將每個依賴jar的內容復制到生成的jar中來實現。

使用“Launcher”主類是不是更好,它的功能只是將調用分派給實際的控制器類,並使用鏈接文件作為最終包裝,而不是擺弄-cp選項的WM?

在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"

將鏈接放在“sendTo”文件夾中非常有用...一個隱藏的jar,由激活其中一個方面的許多鏈接調用,可以更簡單地部署jar邏輯的更新。

所選的實際文件將作為鏈接定義中的參數之后的字符串列表傳遞。

這樣,您就不必擔心整個類路徑問題。

Jar文件在清單中只能包含一個Main-Class屬性,這意味着java -jar myjar.jar只能啟動一個類。

您可以使用啟動其他可運行的類

java -cp myjar.jar OtherClass

但這不會支持用戶雙擊jar文件。

根據用戶的熟練程度,可能命令行也可以。 如果沒有,您可以為每個可運行的類或一個腳本創建一個腳本,該腳本使用參數來選擇正確的類。

這個文檔將幫助您。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM