Как добавить ресурсы в classpath - PullRequest
16 голосов
/ 15 сентября 2010

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

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

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

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

Добавление папки с изображениями в библиотеки проекта netbeans (Свойства -> Библиотеки -> Добавить JAR / Папка), похоже, не работает, потому что в результате я обнаружил ошибку «... \ project \ art - это каталог или может не читать. Не копировать библиотеки. что, в свою очередь, предотвращает копирование даже папки реальных библиотек.

Есть идеи?

С наилучшими пожеланиями Chris

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

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

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

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

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

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

Edit:

На основании комментариев Тушара и этой публикации Я нашел следующее решение приемлемым компромиссом между функциональностью и комфортом.

Я перезаписываю цель ANT из автоматически сгенерированного файла build-impl.xml, который создает путь к классам в файле MANIFEST.MF в базовом файле build.xml проекта Netbeans. Код, который идет в файл build.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. Это приведет к дополнительной записи в файле MANIFEST.MF ('lib / art'), а также к тому, что библиотеки не будут автоматически скопированы в папку 'dist' с сообщением

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

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

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

Ответы [ 3 ]

13 голосов
/ 16 сентября 2010
  1. Добавление папки ресурса в classpath:

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

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

    косая черта важна после искусств в пути к классам.

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

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

    Добавьте цель следующим образом вФайл build.xml:

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

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

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

    ПРИМЕЧАНИЕ. Файлы manifest.mf и build.xml, расположенные в корневом каталоге проекта, доступны из панели файловв среде IDE NetBeans

10 голосов
/ 24 июня 2012

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

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

Ресурсы добавлены в проект.

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

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

BufferedImage zero = ImageIO.read(OCR.class.getResourceAsStream("/0.bmp"));
1 голос
/ 29 сентября 2011

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

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