2010-10-20 43 views
42

我遇到了從一個JAR文件運行多個不同類的問題。我知道我可以設置內部JAR中的類由主類,將命令java -jar myjar.jar後運行的一個,但我想是這樣的:JAR中的多個可運行類,如何運行它們?

java -jar myjar.jar MyClass 

是否有可能這樣做,或做我必須創建多個JAR(每個可用於一個runnable類),還是創建'manager'類會運行其他類傳遞給它們的命令行參數更好?
我正在尋找文檔或參考,但我找不到任何。

回答

52

可執行Jar文件格式只允許您指定一個主類。爲了讓您能夠執行不同的應用程序,你要麼需要創建一個「經理」按照你的建議,或使用替代類路徑:

java -cp myjar.jar MyClass 

但是,這種方法會忽略你的classpath已在Jar的清單文件中配置。

+0

Ignorig類路徑裏面的清單是我的擔心之一。但我已經測試了這個解決方案,它似乎工作(但我不知道爲什麼真的,因爲我已經在清單中設置了類路徑) – wlk 2010-10-20 09:58:47

+2

這是因爲這種啓動形式並不會讀取清單。只有-jar表單才能讀取清單。 – 2010-10-20 22:17:46

8

你將不得不使用方法:用

java -cp myjar.jar MyClass 

即把JAR到類路徑,那麼任何類:

java -cp myjar.jar MyClass 

java -cp myjar.jar OtherMainClass 
4

你不喜歡這樣一個主要的方法可以通過指定它的全限定名來運行。 -jar選項僅作爲使用JAR清單中的信息(也可以在類路徑中包含其他JAR以及指定主類)的快捷方式存在。

0

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

可以啓動其他可運行的類與

java -cp myjar.jar OtherClass 

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

根據用戶的熟練程度,可能命令行對他們來說是OK的。如果沒有,您可以爲每個可運行類或一個腳本創建一個腳本,該腳本需要參數來選擇正確的類。

1

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

有幾種方法可以實現這一點,但基本的東西是放置一個類似於下面的類,它調用傳遞參數的主要方法。

package com.acme.myapp; 

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

至於這種包裝,使用maven辦法之一是與maven-assembly-pluginjar-with-dependencies魔力。這裏的優點是,mojo將爲自包含的目標main方法構建一個jar,並且不需要在classpath上有其他程序集。它通過將每個依賴項jar的內容複製到生成的jar中來完成。

2

如果使用「Launcher」主類,它的功能只是將調用分派給實際控制器類,並將鏈接文件用作最終包裝器,而不是擺弄 - 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" 

的鏈接將鏈接放置在「sendTo」文件夾中非常有用......一個被許多鏈接調用的隱藏的jar文件可以更容易地部署jar邏輯的更新。

所選的實際文件以鏈接定義中的params之後的字符串列表形式傳遞。

這樣,你不應該擔心整個類路徑問題。