2010-02-06 56 views
14

可能重複:
Put external library to the JAR?的NetBeans - 部署在同一個罐子

我的NetBeans 6.8,我寫了有兩個庫(JAR文件)一類。 構建它,我用我的project.jar和包含兩個lib jar文件的「lib」文件夾得到一個「dist」文件夾。

我怎麼能在一個jar文件中得到這一切? (我不使用Maven/Ant或類似的東西。)

+0

試試這個博客... http://arunasujith.blogspot.com/2011/08/how-to-build-fat-jar-using-netbeans.html – 2013-03-22 09:39:26

回答

13

基本的問題是,當前版本的Java不支持開箱即用的JAR。

建議的解決方案是使用jar中MANIFEST.MF文件中的Class-Path行指向所需的庫(允許相對路徑),然後將所有文件一起部署並使用「java -jar your .jar「

如果你真的想擁有一個」jar-jar「解決方案,我們已經使用了一個jar幾年,但是離開了它,因爲我們的目標JVM在上述解決方案中運行得更好。

http://one-jar.sourceforge.net/

我在Eclipse的插件fatjar用它。我沒有任何關於將其構建到Netbeans中的經驗,但是構建成一個螞蟻腳本很簡單,我相信它是NEtbeans使用的。

12

您可以在build.xml文件中創建額外的構建目標。 並使用zipfilesetzipgroupfileset來創建一個大罐子 例如,

<target name="YourBigJar" depends="-post-jar"> 
    <jar destfile="BigJar.jar"> 
    <zipfileset src="dist/Project1.jar"/> 
    <zipfileset src="../OtherProject/dist/project2.jar"/> 
    <zipgroupfileset dir="../libs/."/> 
    </jar> 
</target> 
+0

使用螞蟻+1可能是最好的方法 – stacker 2010-02-06 12:14:18

+3

通知這將打破有簽名的罐子等 – 2010-02-06 16:33:31

11

我同意韋弗裏克。使用NetBeans完成此任務的最簡單方法是將自定義目標添加到您的build.xml中。 (順便說一下,由於使用NetBeans,您使用的是Ant,因爲NetBeans使用Ant來構建您的jar文件。)

Waverick的Ant目標似乎設計爲將來自不同NetBeans項目的編譯代碼合併到當前項目的jar文件。我的下面的目標完全符合你的要求。

<target name="-unjar-and-copy-lib-jars"> 
    <unjar dest="${build.classes.dir}"> 
     <fileset dir="lib"> 
      <include name="**/*.jar"/> 
     </fileset> 
     <patternset> 
      <exclude name="META-INF/**"/> 
      <exclude name="/*"/> 
     </patternset> 
    </unjar> 
</target> 

<target depends="init,compile,-pre-pre-jar,-pre-jar,-unjar-and-copy-lib-jars" name="fat-jar"> 
    <property location="${build.classes.dir}" name="build.classes.dir.resolved"/> 
    <jar destfile="${dist.jar}"> 
     <fileset dir="${build.classes.dir}"/> 
     <manifest> 
      <attribute name="Main-Class" value="${main.class}"/> 
     </manifest> 
    </jar> 
    <echo>To run this application from the command line without Ant, try:</echo> 
    <property location="${dist.jar}" name="dist.jar.resolved"/> 
    <echo>java -jar "${dist.jar.resolved}"</echo> 
</target> 

<target depends="clean,fat-jar" name="clean-and-fat-jar"/> 
+1

只要你將更改爲,這個工作很好,謝謝:) – Macmee 2011-12-27 00:56:59

+0

有一個新的鏈接到您的博客發佈? – kevingreen 2012-04-12 13:15:13

+1

沒關係,我發現它:[來自NetBeans的脂肪罐](http://joshuaborn.name/blog/cb49/) – kevingreen 2012-04-12 13:43:31

1

您可以用Java編程安裝使用Class.getResourceAsStream()FileOutputStream外部庫。圖書館通常會進入Java\lib\ext\

以下是我走近它:

我放在副本中的所有JAR的我用成.res子包。從那裏,我可以在任何地方複製它們。

private void installLibraries() { 
    new Thread() { 

     @Override 
     public void run() { 
      System.out.println("Checking for libraries"); 

      File jre = new File(System.getProperty("java.home")); 
      File jar = new File(jre, "lib/ext/JAR_NAME.jar"); 
      //Create more File objects that wrap your JAR's 
      try { 
       boolean added = false; 

       if (!jar.exists()) { 
        copyResource(jar, "JAR_NAME.jar"); 
        added = true; 
       } 
       //Repeat for more JAR's 

       if (added) { 
        System.out.println("Libraries installed."); 
       } else { 
        System.out.println("Library check complete"); 

      } catch (IOException ex) { 
       System.out.println("Library installation failed."); 
       ex.printStackTrace(System.out); 
      } 
     } 

     private void copyResource(File dest, String src) throws IOException { 
      System.out.println("Copying resource " + src + " to " + dest); 
      InputStream in = THIS_CLASS_NAME.class.getResourceAsStream("/YOUR_PACKAGE/res/" + src); 
      dest.getParentFile().mkdirs(); 
      FileOutputStream out = new FileOutputStream(dest); 
      byte[] buffer = new byte[1024]; 
      int i = 0; 
      while ((i = in.read(buffer)) > 0) { 
       out.write(buffer, 0, i); 
      } 
      out.close(); 
      in.close(); 
     } 
    }.start(); 
} 

運行這個方法,你做任何事情之前,你完全可以無視外部JAR文件的Netbeans給你,只是分配一個。作爲補充說明,我使用這種方法來安裝javax.comm,它不喜歡在外部分發。它帶有一個.dll文件和一個屬性文件。這些文件可以使用完全相同的方法安裝,但值得注意的是。dll文件必須放在Java\lib\目錄中,而屬性文件放在Java\lib\目錄中(不在\ext文件夾中)。

3

我找到了一篇好文章here。但似乎值得一提的是它要求在dest/lib文件夾中的外部庫。你可以這樣做,但通常我們在根文件夾中有lib文件夾(或者我有)。如果它只是改變

<zipgroupfileset dir="dist/lib" includes="*.jar"/>

<zipgroupfileset dir="/lib" includes="*.jar"/>. 

這就是全部。