Как добавить ресурсы в classpath
Как добавить папку (например, папку ресурсов, содержащую изображения) в classpath проекта netbeans? Мне удалось сделать это вручную, отредактировав сгенерированный NB файл jar проекта (то есть его файл MANIFEST.MF + копирование ресурсов вручную), но должен быть способ сказать сетевым компонентам также обращать внимание на ресурсы, не так ли?
Структура папок выглядит следующим образом:
/project/art/
/project/dist/lib/
/project/dist/art/
/project/dist/project.jar
/project/lib/
/project/src/
Я не хочу упаковывать искусство в банку, потому что я хотел бы, чтобы искусство легко обменивалось. Если я добавлю папку с изображениями в папку src, то NB скомпилируется нормально, но ресурсы для искусства попадают в банку.
Добавление папки «art» в библиотеки проекта netbeans («Свойства» -> «Библиотеки» -> «Добавить JAR / папку»), похоже, не сработало, потому что в результате я обнаружил ошибку «... \ project \ art является каталогом или не может быть читать. Не копировать библиотеки. что, в свою очередь, предотвращает копирование даже папки реальных библиотек.
Есть идеи?
С наилучшими пожеланиями Крис
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 названа неверно, то есть разрешены только реальные банки?
б) Добавление папки ресурсов в список библиотек, тем не менее, добавит еще одну запись в MANIFEST.MF. Хотя - и это меньшая проблема - запись пути к классу, похоже, всегда ожидает, что папка ресурса будет подпапкой папки библиотеки (например, «lib / arts»), главная проблема заключается в том, что, похоже, отсутствует косая черта. Как уже упоминалось, сгенерированная NB запись в MANIFEST.MF будет выглядеть так: «lib / arts» (что не работает для меня), в то время как (ручная установка) «lib / arts /» - ?!
То, как я использую ресурсы из папки, выглядит примерно так:
URL resource = getClass().getResource("/gui/refresh.png");
ImageIcon tmp = new ImageIcon(resource);
Редактировать:
Основываясь на комментариях Tushars иэта публикация Я нашел следующее решение приемлемым компромиссом между функциональностью и комфортом.
Я переопределил цель 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 и перестроить.
Идеи о более обтекаемой установке без каких-либо компромиссов, конечно, все еще приветствуются. :)