无论如何都要将jar添加到sbt中的unmanagedClasspath

时间:2013-08-30 05:17:59

标签: android scala sbt sbt-android-plugin

我正在使用带有sbt的android-sbt-plugin,我想在测试类路径中添加一个非托管jar。原因是android.jar包含org.json库的存根函数,导致单元测试抛出异常。这就是我正在做的事情

    unmanagedClasspath in Test <+= (baseDirectory) map { base =>
    Attributed.blank(base/"test-libs"/"json.jar")
    }

由于jar的顺序,在我在sbt中运行test命令时会忽略此文件。如果我输入命令,命令会清楚地将android.jar显示为第一个jar

  

show test:unmanaged-classpath       [info] ArrayBuffer(归因于(/ home / rohit / Projects / android-sdk-linux / platforms / android- 17 / android.jar),归因于(/ home / rohit / Projects / barfrendz / trunk / src / buzze / test-库/ json.jar))

如果我创建了一个lib文件夹并让sbt拿起json jar,那么顺序就会反转现在运行的测试,但由于与android.jar中的org.json命名空间冲突,我无法再创建一个android包。这是例外

[error] (Buzze/android:proguard) java.io.IOException: Can't read [/home/rohit/Projects/barfrendz/trunk/src/buzze/lib/json.jar(;;;;!META-INF/MANIFEST.MF,!**/R.class,!**/R$*.class,!**/TR.class,!**/TR$.class,!**/library.properties)] (Can't process class [org/json/CDL.class] (Unsupported version number [51.0] for class format))

无论如何,我可以更改单元测试的类路径中的jar的顺序吗?

2 个答案:

答案 0 :(得分:1)

不使用<+=,而是使用<<=,将unmanagedClasspath本身作为依赖项,然后根据需要进行修改。 documentation有一个resolvers的例子:

resolvers <<= resolvers {rs =>
  val localMaven = "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
  localMaven +: rs
}

这样,localMaven首先在resolvers中结束。

根据API docsunmanagedClasspathTask类型的Classpath。请注意,使用该语法时,您要更改Classpath,而不是Task

类路径的API文档是here - 它是type,它指向Seq[Attributed[File]],因此您可以使用任何Seq命令对其进行操作。我在这里试用了它的代码片段,它可以工作:

$ cat build.sbt
unmanagedClasspath in Test <<= (unmanagedClasspath in Test, baseDirectory) map { (uc, base) =>
    Attributed.blank(base/"test-libs"/"json.jar") +: uc
}

Daniel@DANIEL-PC /c/scala/Programas/sbtTest
$ sbt
[info] Set current project to default-60c6f9 (in build file:/C:/scala/Programas/sbtTest/)
> show test:unmanaged-classpath
[info] ArrayBuffer(Attributed(C:\scala\Programas\sbtTest\test-libs\json.jar))
[success] Total time: 0 s, completed 30/08/2013 13:32:42
>

答案 1 :(得分:0)

也许覆盖unmanagedJars而不是unmanagedClasspath会允许你这样做:

http://www.scala-sbt.org/0.12.3/docs/Detailed-Topics/Library-Management.html