2010-09-15 52 views
13

¿Cómo se agrega una carpeta (por ejemplo, una carpeta de recursos que contiene artes) al classpath de un proyecto netbeans? Logré hacerlo manualmente editando el archivo jar generado por NB del proyecto (es decir, su archivo MANIFEST.MF + copiando los recursos manualmente), pero debería haber una manera de decirle a los netbeans que también se preocupen por los recursos, ¿no?Cómo agregar recursos a classpath

estructura de la carpeta es el siguiente:

/project/art/ 
/project/dist/lib/ 
/project/dist/art/ 
/project/dist/project.jar 
/project/lib/ 
/project/src/ 

no quiero para empaquetar el arte en el frasco porque me gustaría la técnica que son fácilmente intercambiables. Si agrego la carpeta art a la carpeta src, entonces NB compila bien, pero los recursos artísticos terminan en el contenedor.

Agregando la carpeta art a las bibliotecas del proyecto netbeans (Propiedades -> Bibliotecas -> Agregar JAR/Carpeta) parecía no funcionar, porque luego terminé con un error '... \ project \ art es un directorio o no se puede leer No copiando las bibliotecas. lo que a su vez evita que se copie incluso la carpeta de bibliotecas reales.

¿Alguna idea?

Saludos Chris

2 Las observaciones realizadas, en base a los comentarios de gpeche: a) especificando lugar la carpeta de recursos adicionales en la pestaña "Ejecutar" que en la ficha "Compilar" de las propiedades del proyecto - > Las bibliotecas no parecen hacer una gran diferencia en Netbeans (actualmente estoy usando 6.9.1). La salida (y por tanto de error) se mantiene igual, eso no es nada en absoluto se copia:

Created dir: C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\dist 
C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\art is a directory or can't be read. Not copying the libraries. 
Not copying the libraries. 
Building jar: C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\dist\VocabularyTrainer.jar 

Otro aspecto interesante es que en el menú de ayuda del panel Bibliotecas nada se menciona de forma explícita en relación con las carpetas como bibliotecas. ¿Podría ser posible que el botón en Netbeans se nombre falsamente, que solo se permiten los jar's reales?

b) Agregar la carpeta de recursos a la lista Bibliotecas tiene el impacto, sin embargo, para agregar otra entrada a MANIFEST.MF. Si bien, y ese es el problema menor, la entrada classpath parece esperar siempre que la carpeta de recursos sea una subcarpeta de la carpeta de la biblioteca (por ejemplo, "lib/arts"), el principal problema es que parece que falta una barra. Como se mencionó, la entrada generada por NB en MANIFEST.MF se verá como esta "lib/arts" (que no funciona para mí), mientras que (ajuste manual) "lib/arts /" hace ?!

La forma utilizo los recursos de la carpeta es algo parecido a esto:

URL resource = getClass().getResource("/gui/refresh.png"); 
ImageIcon tmp = new ImageIcon(resource); 

Editar:

Basado en comentarios Tushars y this posting me encontré con la siguiente solución para ser una solución de compromiso aceptable entre la funcionalidad y consuelo

Anulo el objetivo ANT del archivo generado automáticamente 'build-impl.xml' que crea el Class-Path en el archivo MANIFEST.MF en el archivo 'build.xml' básico del proyecto Netbeans. El código que va al archivo 'build.xml' se parece a esto:

<property name="art.classpath" value="art/" /> 

    <target name="-post-jar"> 
    <mkdir dir="${dist.dir}/art"/> 
    <copy todir="${dist.dir}/art"> 
     <fileset dir="${basedir}/art"> 
     <!-- <exclude name="**/!source/**"/> if you want to exclude something... --> 
     </fileset> 
    </copy> 
    </target> 

    <target name="-init-macrodef-copylibs"> 
    <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3"> 
     <element name="customize" optional="true"/> 
     <sequential> 
     <property location="${build.classes.dir}" name="build.classes.dir.resolved"/> 
     <pathconvert property="run.classpath.without.build.classes.dir"> 
      <path path="${run.classpath}"/> 
      <map from="${build.classes.dir.resolved}" to=""/> 
     </pathconvert> 
     <pathconvert pathsep=" " property="jar.classpath"> 
      <path path="${run.classpath.without.build.classes.dir}"/> 
      <chainedmapper> 
      <flattenmapper/> 
      <globmapper from="*" to="lib/*"/> 
      </chainedmapper> 
     </pathconvert> 
     <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/> 
     <copylibs compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}"> 
      <fileset dir="${build.classes.dir}"/> 
      <manifest> 
      <attribute name="Class-Path" value="${jar.classpath} ${art.classpath}"/> 
      <customize/> 
      </manifest> 
     </copylibs> 
     </sequential> 
    </macrodef> 
    </target> 

La desventaja es que para el desarrollo en Netbeans todavía tengo que agregar la carpeta de recursos (por ejemplo, 'arte') a las bibliotecas a listar hacer que el proyecto se ejecute en Netbeans. Esto causará una entrada adicional en el MANIFIESTO.archivo MF ('lib/arte'), junto con el efecto de que las bibliotecas no se copiarán automáticamente en la carpeta 'dist', con el mensaje

...\art is a directory or can't be read. Not copying the libraries. 
Not copying the libraries. 

Este behavor es - que yo sepa - destinado (para obligar a que todo estar atado en un frasco), a pesar de que hay discusiones sobre lo que está pasando. Para hacer un paquete de distribución real, tendría que quitar las carpetas de recursos de la lista de bibliotecas en NB y reconstruirlas.

Por supuesto, las ideas sobre una configuración más simplificada sin ningún tipo de compensación son bienvenidas. :)

Respuesta

12
  1. Adición carpeta de recursos a la ruta de clase:

    Cuando Clean-& -Construcción de un proyecto basado en NetBeans Ant crea un archivo manifest.mf en el directorio raíz del proyecto. Este archivo también se incluye en el archivo JAR. Modifique este archivo y agregue entradas de la siguiente manera:

    Manifest-Version: 1.0 
    X-COMMENT: Main-Class will be added automatically by build 
    Class-Path: arts/ 
    

    slash es importante después de las artes en la ruta de la clase.

  2. incluyendo la carpeta de recursos artes en la distribución

    copiar esta carpeta en la carpeta dist después de la acumulación o añadir un objetivo ANT para copiar los recursos necesarios en la carpeta dist.

    Añada el destino de la siguiente manera, como en el archivo build.xml:

    <target name="-post-jar"> 
        <mkdir dir="${dist.dir}/resources"/> 
        <copy todir="${dist.dir}/resources"> 
         <fileset dir="${basedir}/resources" /> 
        </copy> 
    </target> 
    
  3. código para acceder a dichos recursos:

    El código necesario para acceder a dichos archivos de recursos serán los siguientes: (Esto no funcionará en tiempo de diseño pero seguramente desde el archivo JAR)

    // pay attention to relative path 
    URL resource = ClassLoader.getSystemResource("gui/refresh.png"); 
    ImageIcon tmp = new ImageIcon(resource); 
    

    NOTA: Los archivos manifiestan.mf y build.xml ubicado en el directorio raíz del proyecto son accesibles desde el panel Archivos en NetBeans IDE

+0

1) añadir algo al archivo manifest.mf proyecto NB (que es el Class-Path en este caso) parece anular cualquier otra cosa que de lo contrario ir allí (por ejemplo, el otras bibliotecas agregadas al proyecto). ¿Alguna idea de cómo recuperar el camino original también? Por ejemplo, las bibliotecas se copiarían. 3) para mí no funciona sin la barra diagonal - tengo que agregar esa barra, entonces funciona. – ChristianS

+0

Sugeriría primero generar el manifest.mf de la compilación de NetBeans y luego usar esos valores de ruta de clase predeterminados más las rutas de directorio adicionales agregadas. –

+0

Agregue también una guía sobre cómo excluir los recursos de la carpeta, por lo que no se incluirá en .jar – GusDeCooL

1

Con el fin de eliminar el lib/arte de la Clase-Path y no conseguir "es un directorio o no puede leerse" necesidad de eliminar lib/arte de la ruta:

<pathconvert property="run.classpath.without.build.classes.dir"> 
     <path path="${run.classpath}"/> 
     <map from="${build.classes.dir.resolved}" to=""/> 
     **<map from="${basedir}/art" to=""/> <!-- remove art from lib -->** 
    </pathconvert> 
8

el uso de NetBeans 8.0.2:

  1. Haga clic con el proyecto.
  2. Seleccionar Propiedades.
  3. Seleccionar Fuentes.
  4. Haga clic en Agregue la carpeta para Carpetas del paquete fuente.
  5. Seleccione el directorio donde se encuentran los recursos.
  6. Haga clic en Abra en el nombre del directorio.
  7. Haga clic en Aceptar para cerrar el cuadro de diálogo Propiedades del proyecto.

Los recursos se agregan al proyecto.

Verás el directorio añadido en su panel de navegación, así

En el otro proyecto, los recursos ya están disponibles. Por ejemplo, para leer una imagen:

BufferedImage zero = ImageIO.read(OCR.class.getResourceAsStream("/0.bmp")); 
Cuestiones relacionadas