2011-01-27 65 views
4

關於構建可執行jar文件的問題。假設我們有一個包含UI.class的jar文件a.jar。我已經使用在歸檔a.jar文件的圖元文件,上面寫着嵌套的jar文件

Main-Class: UI 
Class-Path: . b.jar c.jar 

現在,如果我希望將此可執行a.jar文件給別人,我有出貨3個文件 - a.jar文件,b.jar和c 。罐。用戶必須將所有3放在同一個文件夾中,然後雙擊a.jar才能工作。如果我可以發佈一個單獨的文件(a.jar),那麼JVM就可以更簡單地從中提取b.jar和c.jar來使用這些類。這兩個是外部庫,我不想擴展它們並重新打開a.jar中的類文件。

可以這樣做嗎?如果是這樣,那麼jar命令是什麼以及metafile中應該包含哪些內容?目前的命令是

jar cmf metafile a.jar UI.class 

謝謝。

回答

1

你看過這個工具OneJar?另外this是在OneJar上閱讀的好文章。

如果您決定不使用外部工具,那麼您的替代方法是將庫/助手罐放入清單中的類路徑中,然後將罐自身複製到相對於主罐的目錄路徑中。

編輯:OP問一個例子MANIFEST.MF。我從示例One-Jar example jar文件中處理了這個問題。

Manifest-Version: 1.0 
Main-Class: com.simontuffs.onejar.Boot 
One-Jar-Expand: expand,doc 
+0

我已經試過這樣做,它工程,但除非你的JAR文件很小,否則會導致應用程序啓動速度非常慢。 – 2011-01-27 15:47:30

0

OneJar很適合將幾件東西捆綁在一起,但它通常很慢且不靈活。這不是對OneJar的挖掘,它對於它的功能很棒,但除非我想要一個小程序的快速和輕鬆分發,否則我不會使用它。

我確實使用了它一段時間,但後來切換到izpack。它提供了一個安裝程序作爲一個單一的jar,我發現它通常工作得很好,並支持諸如windows特定快捷方式之類的東西。將它與螞蟻集成也很容易。

0

另一種方式可以使用幾種可用工具之一來創建安裝交付件,並且安裝程序包將在安裝時解開應用程序。

1

有人提到OneJar,但也(尤其是如果你使用日食),你可以考慮fatjar

另外,您還可以使用這裏的Ant任務實現這一目標是一個例子:

<target name="dist" depends="compile,static" description="Compiles and builds jar files"> 

    <mkdir dir="${dist}"/> 

    <jar destfile="${dist}/MYAPP.jar"> 
     <zipfileset src="${dist}/MY_OTHER_APP.jar"/>  
     <zipfileset src="${lib}/commons-io-1.4/commons-io-1.4.jar"/> 
     <zipfileset src="${lib}/commons-math-2.1/commons-math-2.1.jar"/> 

     <fileset dir="${res}" includes="*"/> 

     <manifest> 
      <attribute name="Main-Class" value=<where your main class is>/> 
     </manifest> 
    </jar> 
</target>