Como adicionar recursos ao caminho de classe

Como você adiciona uma pasta (por exemplo, uma pasta de recursos contendo arts) ao caminho de classe de um projeto do netbeans? Eu consegui fazer isso manualmente, editando o arquivo jar gerado pelo NB do projeto (que é o arquivo MANIFEST.MF + copiando os recursos manualmente), mas deve haver uma maneira de informar ao netbeans também para cuidar dos recursos, não?

A estrutura da pasta fica assim:

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

Não quero empacotar a arte no pote, porque gostaria que a arte fosse facilmente trocável. Se eu adicionar a pasta art à pasta src, o NB compila bem, mas os recursos artísticos acabam no jar.

Adicionar a pasta art às bibliotecas do projeto netbeans (Propriedades -> Bibliotecas -> Adicionar JAR / Pasta) pareceu não funcionar, porque acabei com um erro '... \ project \ art é um diretório ou não pode ser ler. Não estou copiando as bibliotecas. o que, por sua vez, impede que até a pasta real das bibliotecas seja copiada.

Alguma ideia?

Atenciosamente Chris

2 Observações feitas, com base nos comentários do gpeche: a) Especificando a pasta de recursos adicionais na guia "Executar" do que na guia "Compilar" das propriedades do projeto -> Bibliotecas não parecem fazer muita diferença em Netbeans (atualmente estou usando o 6.9.1). A saída (e, portanto, o erro) permanece a mesma, ou seja, nada é copiado:

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

Outro aspecto interessante é que no menu de ajuda do painel Bibliotecas nada é mencionado explicitamente sobre pastas como bibliotecas. Seria possível que o botão no Netbeans tenha um nome falso, ou seja, apenas jars reais são permitidos?

b) A adição da pasta de recursos à lista Bibliotecas tem o impacto, para adicionar outra entrada ao MANIFEST.MF. Enquanto - e esse é o problema menor - a entrada do caminho de classe parece estar sempre esperando que a pasta de recursos seja uma subpasta da pasta da biblioteca (por exemplo, "lib / arts"), o principal problema é que parece haver uma barra faltando. Como mencionado, a entrada gerada pelo NB no MANIFEST.MF será semelhante a esta "lib / arts" (que não funciona para mim), enquanto (definida manualmente) "lib / arts /" funciona ?!

A maneira como eu uso os recursos da pasta é algo como isto:

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

Editar:

Baseado nos comentários de Tushars eesta postagem Eu achei a solução a seguir uma troca aceitável entre funcionalidade e conforto.

Substituí o destino ANT do arquivo 'build-impl.xml' gerado automaticamente, que cria o caminho da classe no arquivo MANIFEST.MF no arquivo básico 'build.xml' do projeto Netbeans. O código que vai para o arquivo 'build.xml' se parece com o seguinte:

  <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>

A desvantagem é que, para o desenvolvimento no Netbeans, ainda preciso adicionar a pasta de recursos (por exemplo, 'art') à lista de bibliotecas para executar o projeto no Netbeans. Isso causará uma entrada adicional no arquivo MANIFEST.MF ('lib / art') junto com o efeito de que as bibliotecas não serão copiadas automaticamente para a pasta 'dist', com a mensagem

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

Esse comportamento tem como objetivo (forçar tudo a ser agrupado em uma jarra), mesmo que haja discussões sobre o assunto. Para criar um pacote de distribuição real, eu precisaria retirar as pastas de recursos da lista de bibliotecas do NB e reconstruir.

As idéias sobre uma configuração mais simplificada, sem trocas, ainda são bem-vindas. :)

questionAnswers(3)

yourAnswerToTheQuestion