Как вы организуете ресурсы без исходного кода, доступные по пути к классам в вашем java-проекте?
Вопрос
В программном проекте, написанном на Java, у вас часто есть ресурсы, которые являются частью проекта и должны быть включены в classpath.Например, некоторые шаблоны или изображения, которые должны быть доступны через classpath (getResource).Эти файлы должны быть включены в созданный JAR-файл.
Очевидно, что эти ресурсы должны быть добавлены в систему контроля версий.Но в какой каталог вы поместили эти файлы?Параллельно с java-исходными файлами или в другом каталоге, который также воспроизводит необходимую структуру пакета?
Решение
Я предпочитаю ваше последнее решение:отдельный каталог, который имитирует структуру пакета исходного кода.Таким образом, они не будут загромождать ваш исходный код, но будут находиться прямо рядом со скомпилированными файлами классов в упакованном файле JAR.
Другие советы
Мавен помещает их в src/main/resources/ (Java-код будет отправлен в src/main/java/).Основная причина заключается в том, что Maven может компилировать код на разных языках, и имеет смысл хранить их отдельно, чтобы одна компиляция не путалась с файлами для другой.
В случае ресурсов Maven заменит в них переменные до того, как они будут добавлены в Jar, поэтому они также являются "скомпилированными" исходными кодами.
Лично я бы предпочел иметь их вместе с исходным кодом, если они тесно связаны с определенными частями кода и если их не слишком много.
Но если для этих файлов имеет смысл иметь свою собственную организационную структуру, или если существуют сотни файлов, из-за которых было бы трудно найти исходный код среди них, я бы сохранил их отдельно.
Это зависит от ваших предпочтений.Смешивание их с файлами исходного кода упрощает рефакторинг, такой как переименование пакетов (поскольку ресурсы перемещаются вместе с исходными текстами), но при наличии более чем нескольких значков, изображений и файлов локализации вы очень легко получаете беспорядок из файлов.
С современными инструментами это также не имеет особого значения.Используете ли вы Eclipse, Netbeans или другой инструмент, все они позволяют вам иметь двоичные пакеты с макетом, отличным от исходного кода.Так что, в конце концов, вы можете делать это так, как вам хочется.
Лично я стараюсь избегать смешивания исходного кода с ресурсами, потому что обычно я меняю ресурсы очень редко, но исходный код меняю очень часто.
Обычно я хожу вот так:
project/src
project/resources
project/classes
project/lib
project/dist
И то, и другое Src и Ресурсы пусть структура пакета и файл сборки будут классы и Ресурсы в качестве входных данных для jar, который помещается в дист.
При внутреннем запуске путь к классу выглядит примерно так: библиотека; классы; ресурсы;
Если приложение уже установлено, установщик создает и помещает каталог ресурсов без изменений при установке.
Вы можете поместить эти вещи в classpath, если ваш инструмент сборки не запутается.Eclipse не будет пытаться скомпилировать ваши файлы jpeg, как и Ant, так что беспокоиться особо не о чем.Приятно то, что если у вас есть много связанных вещей, вы можете хранить их вместе, организованными по функциональности, а не по типу файла.
Мы делаем это там, где я работаю;у нас есть сообщения электронной почты, для которых требуется немного кода и несколько статических ресурсов.Все эти вещи хранятся вместе в одной папке в пути к исходному коду java;мы можем легко добавлять и удалять электронное письмо из системы, не забывая ничего и не допуская ошибок, таких как несоответствие src / путей к ресурсам или потерянные файлы в одном дереве, отсутствующие в другом дереве.
Как уже было сказано, это зависит от вас и может отличаться в зависимости от проекта.Например, с помощью Калитка, это довольно обычно и практично хранить .html
файлы прямо рядом с классами.Кроме того, я часто сохраняю некоторую конфигурацию вместе с исходным кодом - META-INF
, WEB-INF
, ведение журнала.
Чтобы заставить Maven брать ресурсы из исходного дерева, используйте это:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<!-- Web - Wicket -->
<resource>
<filtering>false</filtering>
<directory>src/main/java</directory>
<includes><include>**</include></includes>
<excludes><exclude>**/*.java</exclude></excludes>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/resources</directory>
</testResource>
<!-- Web - Wicket -->
<testResource>
<filtering>false</filtering>
<directory>src/main/java</directory>
<includes><include>**</include></includes>
<excludes><exclude>**/*.java</exclude></excludes>
</testResource>
</testResources>
Основная причина разделения ресурсов - это (имхо) разделение рабочих ролей.Например.если у вас есть проект с командами перевода, вы бы сохранили ресурсы со строками, отделенными от кода, и с другими привилегиями SCM.