2013-01-16 25 views
8

我讀過這使許多文章/解釋,花了太多時間,但一切是不是太廣泛或具體。如何將多個罐子合併爲一個?

這個問題確實只適用於我做了一個Applet。它包含一個類,並需要2個其他Jar庫。我已經將這些包括在項目中(多個項目,因爲我已經在Netbeans和Eclipse中嘗試了這一點...很容易重新創建一個類項目)。所有這一切的關鍵是我的HTML/Web項目不應該處理多個Jar或引用它們。這也不是一個複雜的applet /項目。

本來,我在Netbeans的做到了。它具有主包裝,並且在添加2個罐子之後,它們被放置在「庫」區域(「資源」文件夾)中。在構建它之後,Netbeans爲我的一個包/類創建一個Jar,然後將其他兩個庫放在它旁邊的「lib」目錄中。我希望他們在一個可分發的罐子裏。從很多事情我已經經歷看,我試圖把build.xml中的以下內容:

<target name="YourBigJar" depends="-post-jar"> 
    <jar destfile="dist/BigJar.jar"> 
    <zipfileset src="dist/cxapplet.jar"/> 
    <zipfileset src="resources/dpotapi.jar"/> 
    <zipfileset src="resources/dpotjni.jar"/> 
    </jar> 
</target> 

但它產生什麼。我從NetBeans - deploying all in one jar得到這個。我不知道/瞭解如何使用build.xml,所以如果出現問題(顯然)我不會感到驚訝,但是我沒有收到錯誤/警告消息。

當我在Eclipse中做到了,它有效地將他們,但是當我使用的jar在我的實際web項目,它說,它不能從其他2罐發現的類。我不明白如何解決它,但它是一個類路徑問題?在Eclipse中,我創建了一個名爲「lib」的新目錄,並將Jars放入其中。然後,我右鍵單擊項目,轉到「Java Build Path」,然後添加Jars,並在「Order and Export」選項卡下檢查它們。從我讀過的東西中,右鍵單擊項目,選擇「導出」,選擇「Jar」,取消選中「.classpath」和「.project」文件,只勾選「導出生成的類文件和資源」,然後允許它生成清單文件。就像我說的,這會生成一個Jar,但它的內容是我的包,然後是一個「lib」目錄,它具有另外兩個Jar。 Manifest在那裏,但它非常空,並沒有引用任何文件(不知道這是否重要)。當我把它放在我的網絡應用程序中時,它說applet找不到其他類。

它只是似乎很簡單 - 當分配作爲小建一個包/班,兩個外部罐......合併成一個罐子。有任何想法嗎?

UPDATE:

自從我們開始使用Maven,有人看着使用Maven插件。因此,我們結束了創建一個新的項目來容納小程序(因爲它在多個項目中使用),並在我們的pom.xml用這個,到底:

<build> 
    <resources> 
    <resource> 
     <directory>${basedir}/applet</directory> 
     <excludes> 
     <exclude>codesignstore</exclude> 
     </excludes> 
    </resource> 
    <resource> 
     <directory>${basedir}/src/main/resources</directory> 
     <filtering>true</filtering> 
    </resource> 
    </resources> 
    <plugins> 
    <plugin> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.2-beta-5</version> 
     <configuration> 
     <descriptorRefs> 
      <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <finalName>cxapplet</finalName> 
     <archive> 
      <index>true</index> 
      <manifest> 
      <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
      </manifest> 
     </archive> 
     <appendAssemblyId>false</appendAssemblyId> 
     </configuration> 
     <executions> 
     <execution> 
      <id>make-my-applet-jar</id> 
      <phase>package</phase> 
      <goals> 
      <goal>single</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jarsigner-plugin</artifactId> 
     <version>1.2</version> 
     <executions> 
     <execution> 
      <id>sign</id> 
      <goals> 
      <goal>sign</goal> 
      </goals> 
     </execution> 
     </executions> 
     <configuration> 
     <keystore>${basedir}/applet/codesignstore</keystore> 
     <alias>codesigncert</alias> 
     <storepass>HIDDEN</storepass> 
     <keypass>HIDDEN</keypass> 
     </configuration> 
    </plugin> 
    </plugins> 
</build> 

而且因爲它允許我們使用很高興我們代碼簽名證書也可以自動簽名。

+1

*「所有這一切的一點是,我的HTML/Web項目中不應該有應付不止一個瓶」 *這是容易做到這使瀏覽器可以處理它。 *「任何想法?」*以通常的方式部署Jars(與當前策略相比具有優勢)並節省您的時間。 –

+0

它更好地使一個罐子的依賴關係到另一個。許多罐子製作工具使您的工作變得輕鬆。 –

+0

@joeyrohan我不確定你的意思,但這就是爲什麼我試圖使用Netbeans和Eclipse的構建工具,我認爲它會這樣做。 – Ian

回答

4

首先,讓我說,真的是沒有理由的罐子結合 - 您可以使用類文件(而不是在一個罐子裏)及其單獨依賴罐子部署一個applet。

不過,如果你覺得你必須做出一個大罐子你的類和所有的依賴,那麼你可以這樣做。

你不能把jar文件到另一個jar文件,但是 - jar文件不工作的方式。 你需要的是所有jar文件的所有內容都被提取出來,然後再壓縮成一個jar文件。

如果你要做到這一點,我會建議使用Maven構建工具來做到這一點。 一旦你使用Maven設置你的版本,你可以配置Maven Assembly Plugin爲你創建一個大的jar。

我知道Eclipse支持Maven的,而且我認爲NetBeans的確實也是如此。

+0

對不起,我知道簡單地將Jars組合起來不會起作用,因爲你提供的原因。所以我想我的觀點是希望得到一個簡單的代碼/工作/邏輯示例,解釋如何在您選擇的場景中完成所需的任務 - Eclipse,Netbeans,Maven等等。因此,正如你建議使用Maven,我不知道你是否可以提供一些步驟來做到這一點。我會看第二個鏈接(因爲我已經安裝了Maven並將它用於不同的項目中,儘管我不是管理它的人)。那謝謝啦 :) – Ian

-1

從你的bin目錄的基礎上,爲什麼不嘗試:

jar.exe -cvf cxapplet.jar * 

將您的外部JAR文件在您的bin目錄中的適當位置,並手動與外部jar文件罐子類文件。

另外,看到this thread這可能會爲您提供更多的信息。

+0

「爲什麼不試試」 - 因爲我didn沒想到它:)它從來沒有跨過我的腦海,我不知道如何有效地使用這個jar工具,或者想到在bin上使用它。另外,'bin'目錄中唯一的東西就是我的主類的編譯代碼(通過它的包),那麼我怎樣才能將這些東西包含在'lib'目錄中('bin'旁邊),這兩個外部Jar ,並將它們與'bin'目錄的內容提取/組合? – Ian

+0

(我從4個月前試過的東西的記憶中做了這個)。在構建項目之後,將您的lib目錄複製到您的構建目錄中。另請參閱我編輯的答案。 – AerusDar

+0

Jeez,我不知道爲什麼我不這麼認爲。所以當我嘗試它時,它確實將它們結合在一起,但它只是將兩個外部Jars放入新Jar的根目錄中......但似乎我真正需要的是從外部Jars中提取所有內容,然後將它們全部壓縮重新走到一起。那有意義嗎?除了將它們添加到清單文件中的類路徑中,Netbeans實際上與您提供的內容完全相同,只是它們可以被識別(或者可以工作)。 – Ian