我在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模式来防止这种行为。
答案 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)
您应该有一个项目结构,如:
无论如何,对于res文件夹,你应该有这样一个条目:
<sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />