Как запретить 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" />