2010-02-06 2 views
14

가능한 복제를 모두 배포는 :
Put external library to the JAR?넷빈즈 - 하나 개의 항아리에

내가 넷빈즈 6.8를하고 난 두 라이브러리 (JAR-파일)가 하나 개의 클래스를 썼다. 그것을 빌드, 내 project.jar 및 "lib"두 lib jar 파일이 들어있는 폴더 "dist"폴더를 얻을.

어떻게 하나의 jar 파일에서이 모든 것을 얻을 수 있습니까? (Maven/Ant 또는 이와 비슷한 것을 사용하지 않습니다.)

+0

이 블로그 포스트를 사용해보세요 ... http://arunasujith.blogspot.com/2011/08/how-to-build-fat-jar-using-netbeans.html –

답변

13

기본 문제는 Java의 현재 버전이 바로 jar 파일 내부의 jar 파일을 지원하지 않는다는 것입니다.

권장되는 솔루션은 항아리 안에있는 MANIFEST.MF 파일의 Class-Path 행을 사용하여 필수 라이브러리 (상대 경로 허용)를 가리킨 다음 모든 파일을 함께 배포하고 "java -jar your .jar "

실제로"jar-inside-jar "솔루션을 원한다면 우리는 몇 년 동안 one-jar를 사용했지만 목표 JVM이 위에 설명 된 솔루션으로 더 잘 작동 했으므로 멀리 떨어져 있습니다.

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

나는 이클립스에서 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

+3

공지 이것은 부호가있는 항아리 등을 깨뜨릴 것입니다. –

11

나는 Waverick에 동의합니다. NetBeans에서이 작업을 수행하는 가장 간단한 방법은 build.xml에 사용자 정의 대상을 추가하는 것입니다. NetBeans는 Ant를 사용하여 jar 파일을 작성하므로 NetBeans를 사용하면 Ant를 사용하게됩니다.

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

+0

블로그 게시하다 ? – kevingreen

+1

신경 쓰지 마라, 나는 그것을 발견했다 : [Fat Jar from NetBeans] (http://joshuaborn.name/blog/cb49/) – kevingreen

1

프로그래밍 방식 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 파일을 무시하고 단지 하나를 배포 할 수 있습니다. 추가적으로이 방법을 사용하여 외부에 배포하는 것을 좋아하지 않는 javax.comm을 설치했습니다. .dll 파일과 특성 파일이 함께 제공됩니다. 이 파일들은 똑같은 방법으로 설치할 수 있습니다 만,dll 파일은 Java\lib\ 디렉토리에 있고 속성 파일은 Java\lib\ 디렉토리 (\ext 폴더 아님)에 있어야합니다.

3

나는 좋은 기사 here을 발견했습니다. 그러나 dest/lib 폴더에 외부 라이브러리를 요청하는 것은 중요합니다. 그렇게 할 수는 있지만 일반적으로 루트 폴더에 lib 폴더가 있습니다 (또는 내가 갖고있는 것). 그냥

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

<zipgroupfileset dir="dist/lib" includes="*.jar"/>을 변경하는 경우 모든 있다고.