Как добавить ресурсы в classpath

как добавить папку (например, папку ресурсов, содержащую arts) в путь к классам проекта netbeans? Мне удалось сделать это вручную, отредактировав созданный NB файл jar проекта (это его манифест.MF-файл + копирование ресурсов вручную), но должен быть способ сказать netbeans, а также помнить о ресурсах, нет?

структура папок выглядит так:

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

Я не хочу упаковывать искусство в банку, потому что я хотел бы, чтобы искусство быть легко заменяемыми. Если я добавлю папку art в папку src, NB компилируется отлично,но художественные ресурсы заканчиваются в банке.

добавление папки art в библиотеки проекта netbeans (свойства -> библиотеки -> добавить JAR/Folder), казалось, не работает, потому что тогда я закончил с ошибкой"...projectart-это каталог или не может быть прочитан. Не копировать библиотеки.- что, в свою очередь, не позволяет копировать даже настоящую папку библиотеки.

любой идеи?

С наилучшими пожеланиями Крис!--6-->

2 замечания, на основе замечаний от gpeche: a) скорее указание папки дополнительных ресурсов на вкладке "выполнить", чем на вкладке "компиляция" свойств проекта -> Библиотеки, похоже, не имеет большого значения в Netbeans (в настоящее время я использую 6.9.1). Выход (и, следовательно, ошибка) остается неизменным, то есть ничего не копируется вообще:

Created dir: C:UsersChrisiDesktopvocabularyVocabularyTrainerdist
C:UsersChrisiDesktopvocabularyVocabularyTrainerart is a directory or can't be read. Not copying the libraries.
Not copying the libraries.
Building jar: C:UsersChrisiDesktopvocabularyVocabularyTrainerdistVocabularyTrainer.jar

еще один интересный аспект заключается в том, что в меню справки Панель "библиотеки" ничего явно не упоминается о папках как библиотеках. Возможно ли, что кнопка в Netbeans ложно названа, то есть разрешены только настоящие банки?

b) добавление папки ресурсов в список библиотек имеет влияние, хотя, чтобы добавить еще одну запись в манифест.МФ. Хотя - и это меньшая проблема-запись classpath, похоже, всегда ожидает, что папка ресурсов будет подпапкой папки библиотеки (например, "lib/arts") , основная проблема в том, что, кажется, отсутствует косая черта. Как уже упоминалось, NB сгенерировал запись в манифесте.MF будет выглядеть как " lib / arts "(который не работает для меня), в то время как (вручную установлен)" lib/arts/ " делает?!

способ использования ресурсов из папки выглядит примерно так:

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

Edit:

на основе комментариев Тушаров и данное сообщение я нашел следующее решение, чтобы быть приемлемым компромиссом между функциональность и комфорт.

Я переопределяю цель ANT из автоматически сгенерированного " build-impl.xml-файл, который создает путь к классу в манифесте.MF-файл в основном ' build.xml-файл проекта Netbeans. Код, который идет на строительство.xml-файл выглядит следующим образом:

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

компромисс заключается в том, что для разработки в Netbeans мне все еще нужно добавить папку ресурсов (например, "art") в список библиотек, чтобы проект работал в Netbeans. Это вызовет дополнительная запись в манифесте.Файл MF ('lib/art') вместе с эффектом, что библиотеки не будут автоматически скопированы в папку "dist", с сообщением

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

это поведение - afaik-предназначено (чтобы заставить все быть завернутым в банку), хотя есть дискуссии об этом. Чтобы сделать настоящий дистрибутив, мне нужно было бы забрать папку(ы) ресурсов из списка библиотек в NB и перестроить.

идеи о более процесс установки без каких-либо компромиссов, конечно, по-прежнему приветствуются. :)

3 ответов


  1. добавление папки ресурсов в classpath:

    когда вы очищаете - & - строите проект на основе NetBeans Ant, он создает манифест.mf-файл в корневом каталоге проекта. Этот файл также включается в файл JAR. Измените этот файл и добавьте следующую запись:

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

    Слэш важен после искусства в пути класса.

  2. включая папку ресурсов искусства в распределение

    либо скопируйте эту папку в папку dist после сборки, либо добавьте цель ANT, чтобы скопировать необходимые ресурсы в папку dist.

    добавьте цель следующим образом в сборке.xml-файл:

    <target name="-post-jar">
         <mkdir dir="${dist.dir}/resources"/>
         <copy todir="${dist.dir}/resources">
             <fileset dir="${basedir}/resources" />
         </copy>
     </target>
    
  3. код для доступа к таким ресурсам:

    код, необходимый для доступа к таким файлам ресурсов, должен быть следующим: (Это не будет работать во время разработки, но, безусловно, из банки файл)

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

    Примечание: манифест файлов.mf и построить.xml, расположенный в корневом каталоге проекта, доступен с панели "файлы" в IDE NetBeans


Использование NetBeans 8.0.2:

  1. щелкните правой кнопкой мыши проект.
  2. выберите свойства.
  3. выберите источник.
  4. клик Добавить Папку на Исходные Папки Пакетов.
  5. выберите каталог, в котором существуют ресурсы.
  6. клик открыть на имя каталога.
  7. клик OK закрыть Свойства диалог.

ресурсы добавляются в проект.

вы также увидите каталог, добавленный в навигационную панель

в другом проекте ресурсы теперь доступны. Например, чтобы прочитать изображение:

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

чтобы удалить lib / art из Class-Path и не получить "является каталогом или не может быть прочитан", нужно удалить lib / art из path:

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