Как добавить ресурсы в 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 ответов
-
добавление папки ресурсов в classpath:
когда вы очищаете - & - строите проект на основе NetBeans Ant, он создает манифест.mf-файл в корневом каталоге проекта. Этот файл также включается в файл JAR. Измените этот файл и добавьте следующую запись:
Manifest-Version: 1.0 X-COMMENT: Main-Class will be added automatically by build Class-Path: arts/
Слэш важен после искусства в пути класса.
-
включая папку ресурсов искусства в распределение
либо скопируйте эту папку в папку dist после сборки, либо добавьте цель ANT, чтобы скопировать необходимые ресурсы в папку dist.
добавьте цель следующим образом в сборке.xml-файл:
<target name="-post-jar"> <mkdir dir="${dist.dir}/resources"/> <copy todir="${dist.dir}/resources"> <fileset dir="${basedir}/resources" /> </copy> </target>
-
код для доступа к таким ресурсам:
код, необходимый для доступа к таким файлам ресурсов, должен быть следующим: (Это не будет работать во время разработки, но, безусловно, из банки файл)
// 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:
- щелкните правой кнопкой мыши проект.
- выберите свойства.
- выберите источник.
- клик Добавить Папку на Исходные Папки Пакетов.
- выберите каталог, в котором существуют ресурсы.
- клик открыть на имя каталога.
- клик 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>