2010-02-06 12 views
14

Duplicar posibles:
Put external library to the JAR?NetBeans - que despliegan todo en un frasco de

que tienen NetBeans 6.8 y yo escribimos una clase que tiene dos bibliotecas (JAR-archivos). Al compilarlo, obtengo una carpeta "dist" con mi project.jar y una carpeta "lib" que contiene los dos archivos jar lib.

¿Cómo podría obtener todo esto en un archivo jar? (No uso Maven/Ant o algo así.)

+0

Pruebe este blogpost ... http://arunasujith.blogspot.com/2011/08/how-to-build-fat-jar-using-netbeans.html –

Respuesta

13

El problema básico es que la versión actual de Java no admite frascos dentro de frascos de fábrica.

La solución recomendada es usar la línea Class-Path en el archivo MANIFEST.MF dentro de su jar para apuntar a las bibliotecas requeridas (se permiten las rutas relativas) y luego desplegar todos los archivos e invocarlo con "java -jar your .jar "

Si realmente desea tener una solución" jar-inside-jar ", hemos utilizado one-jar durante varios años, pero nos alejamos de ella, ya que nuestra JVM objetivo funcionaba mejor con la solución descrita anteriormente.

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

que lo usaron con el plugin fatjar en Eclipse. No tengo ninguna experiencia con la creación en Netbeans, pero es simple construir una secuencia de comandos ant, que creo que es lo que NEtbeans usan de todos modos.

12

Puede crear un objetivo de compilación adicional en el archivo build.xml. Y use zipfileset y zipgroupfileset para crear una jarra grande p.

<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 usando hormiga es probablemente la mejor manera – stacker

+3

Aviso que esto romperá frascos firmados, etc. –

11

Acepto con Waverick. La forma más sencilla de hacerlo con NetBeans es agregar un destino personalizado a su build.xml. (Por cierto, en virtud del uso de NetBeans, está utilizando Ant, ya que NetBeans usa Ant para compilar su archivo jar).

El objetivo Ant de Waverick parece estar diseñado para fusionar el código compilado de un proyecto NetBeans diferente en el archivo jar del proyecto actual. Mis objetivos a continuación hacen exactamente lo que estás buscando.

<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

Siempre y cuando cambie a , esto funciona maravillosamente, gracias :) – Macmee

+0

Tenga un nuevo enlace a su blog publicar? – kevingreen

+1

No importa, lo encontré: [Tarro de grasa de NetBeans] (http://joshuaborn.name/blog/cb49/) – kevingreen

1

Puede utilizar Java para instalar las bibliotecas externas mediante programación utilizando Class.getResourceAsStream() y una FileOutputStream. Las bibliotecas generalmente irán en Java\lib\ext\.

Así es como me acercaba a ella:

Me colocaron una copia de toda la del utilicé en un sub-paquete .res JAR. A partir de ahí, puedo copiarlos en cualquier lugar.

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(); 
} 

Ejecutar este método antes de hacer cualquier otra cosa, y se puede ignorar por completo los archivos JAR externos que Netbeans le da, y acaba de distribuir el uno. Como nota adicional, utilicé este método para instalar javax.comm, que no me gustó que se distribuyera de forma externa. Venía con un archivo .dll y un archivo de propiedades. Estos archivos se pueden instalar utilizando el mismo método exacto, pero vale la pena señalar que el.el archivo dll debe colocarse en el directorio Java\lib\ y los archivos de propiedades van en el directorio Java\lib\ (no en la carpeta \ext).

3

He encontrado un buen artículo here. Pero parece que vale la pena mencionar que es pedir bibliotecas externas en la carpeta dest/lib. Puedes hacerlo de esa manera, pero normalmente tenemos una carpeta lib en la carpeta raíz (o lo que tengo). Si se acaba de cambiar

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

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

eso es todo.