Как добавить ресурсы в путь к классам
Как вы добавляете папку (например, папку ресурсов, содержащую искусство) в путь к классам проекта netbeans? Мне удалось сделать это вручную, отредактировав созданный NB файл jar проекта (то есть его файл MANIFEST.MF + копирование ресурсов вручную), но также должен быть способ сообщить netbeans также учитывать ресурсы, нет?
Структура папок выглядит следующим образом:
/project/art/
/project/dist/lib/
/project/dist/art/
/project/dist/project.jar
/project/lib/
/project/src/
Я не хочу упаковывать искусство в банку, потому что я хотел бы, чтобы искусство было легко заменено. Если я добавлю папку art в папку src, тогда NB компилируется отлично, но художественные ресурсы попадают в банку.
Добавление папки с изображением в библиотеки проектов 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 ложно названа, то есть разрешена только реальная банка?
b) Добавление папки ресурсов в список "Библиотеки" действительно влияет на добавление другой записи в MANIFEST.MF. В то время как - и что меньшая проблема - запись в classpath всегда ожидает, что папка ресурса будет вложенной папкой в библиотечной папке (например, "lib/arts" ), основная проблема заключается в том, что, похоже, отсутствует косая черта.
Как уже упоминалось, запись сгенерированного NB в файле MANIFEST.MF будет выглядеть так: "lib/arts" (который не работает для меня), а (вручную) "lib/arts/" делает?!
То, как я использую ресурсы из папки, выглядит примерно так:
URL resource = getClass().getResource("/gui/refresh.png");
ImageIcon tmp = new ImageIcon(resource);
Edit:
Основываясь на комментарии 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 мне все равно нужно добавить папку ресурсов (например, "искусство" ) в список библиотек, чтобы проект выполнялся в Netbeans. Это вызовет дополнительную запись в файле MANIFEST.MF( "lib/art" ) и эффект, который библиотеки не будут автоматически скопированы в папку "dist", с сообщением
...\art is a directory or can't be read. Not copying the libraries.
Not copying the libraries.
Это поведение - афайк - предназначено (чтобы все было привязано в банке), хотя ходят разговоры о нем. Чтобы создать реальный дистрибутив, мне пришлось бы удалить папки с ресурсами из списка библиотек в NB и перестроить.
Идеи о более упорядоченной настройке без каких-либо компромиссов, конечно, все же приветствуются.:)
Ответы
Ответ 1
-
Добавление папки ресурсов в путь к классам:
Когда вы очищаете & -Build проект на основе NetBeans Ant, он создает файл manifest.mf в корневом каталоге проекта. Этот файл также входит в файл JAR. Измените этот файл и добавьте запись, как показано ниже:
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build
Class-Path: arts/
Слэш важен после искусств в пути к классу.
-
Включая папку ресурсов искусства в дистрибутиве
Скопируйте эту папку в папку 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>
-
Код для доступа к таким ресурсам:
Код, необходимый для доступа к таким файлам ресурсов, должен быть следующим: (Это не будет работать во время разработки, но, безусловно, из файла JAR)
// pay attention to relative path
URL resource = ClassLoader.getSystemResource("gui/refresh.png");
ImageIcon tmp = new ImageIcon(resource);
ПРИМЕЧАНИЕ. Файлы manifest.mf и build.xml, расположенные в корневом каталоге проекта, доступны из Панели файлов в среде IDE NetBeans
Ответ 2
Использование NetBeans 8.0.2:
- Щелкните правой кнопкой мыши проект.
- Выберите Свойства.
- Выберите Источники.
- Нажмите Добавить папку для Папок исходного пакета.
- Выберите каталог, в котором существуют ресурсы.
- Нажмите Открыть в имени каталога.
- Нажмите ОК, чтобы закрыть диалоговое окно Свойства проекта.
Ресурсы добавляются в проект.
Вы также увидите каталог, добавленный в панели навигации
В другом проекте теперь доступны ресурсы. Например, чтобы прочитать изображение:
BufferedImage zero = ImageIO.read(OCR.class.getResourceAsStream("/0.bmp"));
Ответ 3
Чтобы удалить 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>