sbt-android 为多项目构建提供 "IllegalArgumentException already added..." 运行 android:package
sbt-android gives "IllegalArgumentException already added..." running android:package for multi-project build
我有一个带有 actionbarsherlock
子项目的 sbt root
项目,我无法将其打包到 apk 中。
我能够成功构建这两个项目,但是当我 运行 android:package
我从 root/android:dex
任务中得到错误,其中来自 actionbarsherlock 的 类 是 dex' d 两次:
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/actionbarsherlock/ActionBarSherlock$Implementation;
我 运行 last root/android:dex
发现它包括根项目和子项目的 intermediates/class.jar
:
.../actionbarsherlock/bin/intermediates/classes.jar,
.../bin/intermediates/classes.jar
这解释了 dex 错误,但我不知道如何更改我的构建来避免这种情况。
我能够在一个更简单的项目上复制这个问题,其中根项目没有源代码和一个简单的构建配置,例如:
// build.sbt for root
androidBuild
javacOptions in Compile ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil
lazy val root = project.in(file(".")).dependsOn(abs)
lazy val abs = project.in(file("actionbarsherlock"))
和:
// build.sbt for subproject
androidBuild
javacOptions in Compile ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil
libraryDependencies ++= Seq(
"com.android.support" % "support-v4" % "18.0.0"
)
两个项目都有project/build.properties
:
sbt.version=0.13.9
和project/plugins.sbt
:
addSbtPlugin("org.scala-android" % "sbt-android" % "1.6.0")
文件层次结构如下:
.
├── actionbarsherlock
│ ├── AndroidManifest.xml
│ ├── build.sbt
│ ├── lint.xml
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── project.properties
│ ├── README.md
│ ├── res
│ ├── ...
│ ├── src
│ │ ├── ...
│ └── test
│ └── ...
├── AndroidManifest.xml
├── build.sbt
├── lint.xml
├── proguard-project.txt
├── project
│ ├── build.properties
│ └── plugins.sbt
├── project.properties
├── README.MD
├── res
│ ├── ...
├── src
我在 sbt 上使用的典型流程是:
project abs
compile
project root
compile
android:package
提前致谢!
删除 project.properties
中对 actionbarsherlock 的引用。 actionbarsherlock 项目是自动构建的,因为它在 project.properties
中,它是重复的,因为你添加了一个手动子项目。
如果您从未在 actionbarsherlock 项目中设置所有 sbt 项目内容,一切都会正常进行。鉴于您确实设置了它,您没有正确使用依赖项目的 androidBuildWith
函数。从根项目中删除 androidBuild
行并将行中的根项目更改为 project.in(file(".")).androidBuildWith(abs)
此外,请考虑使用 actionbarsherlock apklib 而不是子项目。最重要的是,完全远离 actionbarsherlock。
此外,您可以通过 运行 sbt android:package
从干净的构建中完全构建。不需要所有这些步骤。
我有一个带有 actionbarsherlock
子项目的 sbt root
项目,我无法将其打包到 apk 中。
我能够成功构建这两个项目,但是当我 运行 android:package
我从 root/android:dex
任务中得到错误,其中来自 actionbarsherlock 的 类 是 dex' d 两次:
Uncaught translation error: java.lang.IllegalArgumentException: already added: Lcom/actionbarsherlock/ActionBarSherlock$Implementation;
我 运行 last root/android:dex
发现它包括根项目和子项目的 intermediates/class.jar
:
.../actionbarsherlock/bin/intermediates/classes.jar,
.../bin/intermediates/classes.jar
这解释了 dex 错误,但我不知道如何更改我的构建来避免这种情况。
我能够在一个更简单的项目上复制这个问题,其中根项目没有源代码和一个简单的构建配置,例如:
// build.sbt for root
androidBuild
javacOptions in Compile ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil
lazy val root = project.in(file(".")).dependsOn(abs)
lazy val abs = project.in(file("actionbarsherlock"))
和:
// build.sbt for subproject
androidBuild
javacOptions in Compile ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil
libraryDependencies ++= Seq(
"com.android.support" % "support-v4" % "18.0.0"
)
两个项目都有project/build.properties
:
sbt.version=0.13.9
和project/plugins.sbt
:
addSbtPlugin("org.scala-android" % "sbt-android" % "1.6.0")
文件层次结构如下:
.
├── actionbarsherlock
│ ├── AndroidManifest.xml
│ ├── build.sbt
│ ├── lint.xml
│ ├── project
│ │ ├── build.properties
│ │ └── plugins.sbt
│ ├── project.properties
│ ├── README.md
│ ├── res
│ ├── ...
│ ├── src
│ │ ├── ...
│ └── test
│ └── ...
├── AndroidManifest.xml
├── build.sbt
├── lint.xml
├── proguard-project.txt
├── project
│ ├── build.properties
│ └── plugins.sbt
├── project.properties
├── README.MD
├── res
│ ├── ...
├── src
我在 sbt 上使用的典型流程是:
project abs
compile
project root
compile
android:package
提前致谢!
删除 project.properties
中对 actionbarsherlock 的引用。 actionbarsherlock 项目是自动构建的,因为它在 project.properties
中,它是重复的,因为你添加了一个手动子项目。
如果您从未在 actionbarsherlock 项目中设置所有 sbt 项目内容,一切都会正常进行。鉴于您确实设置了它,您没有正确使用依赖项目的 androidBuildWith
函数。从根项目中删除 androidBuild
行并将行中的根项目更改为 project.in(file(".")).androidBuildWith(abs)
此外,请考虑使用 actionbarsherlock apklib 而不是子项目。最重要的是,完全远离 actionbarsherlock。
此外,您可以通过 运行 sbt android:package
从干净的构建中完全构建。不需要所有这些步骤。