我正在使用带有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的顺序吗?
答案 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 docs,unmanagedClasspath
是Task
类型的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