Как запретить IntelliJ копировать ресурсы в выходной каталог компилятора проекта?
У меня есть следующая структура каталогов в IntelliJ, которая содержит проект библиотеки Android:
java/com/example/base/AndroidManifest.xml
java/com/example/base/assets # contains Android assets
java/com/example/base/res # contains Android resources
java/com/example/base/Base.java
java/com/example/base/base.iml
base.iml
содержит следующее:
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$"
isTestSource="false"
packagePrefix="com.example.base" />
<sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/res" />
</content>
Когда я создаю проект приложения для Android, который зависит от моего проекта библиотеки, я получаю сообщение об ошибке:
[myapp] java.util.zip.ZipException: duplicate entry: res/drawable/image_shadow.9.png
В диалоговом окне Структура проекта я сконфигурировал Выход компилятора проекта как каталог out
в корне моего проекта. Когда я пытаюсь создать свой проект Android, я заметил, что копии моих ресурсов Android попадают в папку out/production/base/com/example/base/res/
.
Моя гипотеза заключается в том, что мои ресурсы Android обрабатываются как "обычные" ресурсы Java (тип, который вы загружаете с помощью Class.getResource()
), поэтому они копируются в out/production
, что, в свою очередь, вызывает duplicate entry
исключение, которое я вижу.
Любая идея, если это так? Если да, то как я могу предотвратить копирование этих файлов? В Eclipse элемент <classpathentry>
в файле .classpath
имеет атрибут excluding
, который принимает шаблон glob, чтобы предотвратить такое поведение.
Ответы
Ответ 1
Я столкнулся с аналогичной проблемой, потому что директория main
была отмечена как "Источники".
Итак, в структуре проекта, для фасета Android, на вкладке "Структура" у меня было:
...
Resources directory: .../src/main/res
...
И под обычной вкладкой "Источники" для модуля, main
dir в src
был помечен как "Источники".
Я исправил его, сделав вкладку "Источники":
- src (unmarked)
- main (unmarked)
- java (Sources)
- res (Resources)
Поэтому я предполагаю, что ошибка связана с тем, что res-объекты упаковываются в zip как в качестве источников, так и в ресурсах, следовательно, дублирование.
Ответ 2
У вас должна быть структура проекта, например:
- project/src/main/res
- project/src/main/assets
- Проект/SRC/главная/Java
- Проект/SRC/главная/AndroidManifest.xml
В любом случае, для папки res вы должны иметь такую запись:
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />