我将android-sbt-plugin
与sbt一起使用,我想将一个非托管jar添加到测试类路径中。原因是android.jar包含org.json库的存根函数,并导致单元测试抛出异常。这就是我正在做的
unmanagedClasspath in Test <+= (baseDirectory) map { base =>
Attributed.blank(base/"test-libs"/"json.jar")
}
由于jar的顺序,当我在sbt中运行测试命令时,会忽略此文件。如果我输入命令,订单会清楚地显示android.jar为第一个jar
显示测试:非托管类路径[info]ArrayBuffer(Attributed(/home/rohit/Projects/android-sdk-linux/platforms/android-17/android.jar),Attributed(/home/rohit/Projects/barfrendz/trunk/src/buze/test-libs/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的顺序?
不要使用<+=
,而是使用<<=
,将unmanagedClasspath
本身作为依赖项,然后根据需要对其进行修改。文档中有这样一个resolvers
:示例
resolvers <<= resolvers {rs =>
val localMaven = "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
localMaven +: rs
}
这样,localMaven
在resolvers
中首先结束。
根据API文档,unmanagedClasspath
是Classpath
类型的Task
。请注意,当您使用该语法时,您更改的是Classpath
,而不是Task
。
类路径的API文档在这里——它是一个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:scalaProgramassbtTesttest-libsjson.jar))
[success] Total time: 0 s, completed 30/08/2013 13:32:42
>
也许覆盖unmanagedJars而不是unmanagedClasspath会允许您这样做:
http://www.scala-sbt.org/0.12.3/docs/Detailed-Topics/Library-Management.html