如何防止IntelliJ将资源复制到项目编译器输出目录中?

时间:2012-10-22 18:01:51

标签: android intellij-idea

我在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又是导致我看到的<classpathentry>异常。

知道是否是这种情况?如果是这样,我该如何防止这些文件被复制?在Eclipse中,.classpath文件中的excluding元素具有{{1}}属性,该属性采用glob模式来防止这种行为。

2 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,因为main dir被标记为&#34;来源&#34;。

所以在项目结构中,对于Android facet,在&#34; Structure&#34;我有这个标签:

... Resources directory: .../src/main/res ...

在正常的&#34;来源&#34;该模块的标签,main下的src目录已被标记为&#34;来源&#34;。

我通过使Sources选项卡看起来像:

来修复它

- src (unmarked) - main (unmarked) - java (Sources) - res (Resources)

所以我猜错误是因为res的东西被打包到zip中作为源和资源因此重复。

答案 1 :(得分:0)

您应该有一个项目结构,如:

  • 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" />