当我尝试创建sbt test
对象的实例时,通过控制台运行MissingResourceException: : Can't find bundle for base name com/sun/rowset/RowSetResourceBundle, locale en_CA
(Windows上为v0.13.1)会抛出com.sun.rowset.CachedRowSetImpl
。如果我使用IntelliJ运行Specs测试,相同的代码运行良好;它只在尝试通过SBT控制台运行时失败。
以下是我正在尝试运行的specs2测试:
import org.specs2.mutable.SpecificationWithJUnit
import javax.sql.rowset.CachedRowSet;
import com.sun.rowset.CachedRowSetImpl
class DatabaseTest extends SpecificationWithJUnit {
"CachedRowSet Test" should {
"Create a new CachedRowSetImpl instance" in {
val rowSet: CachedRowSet = new CachedRowSetImpl()
rowSet must_!= null
}
}
}
由此产生的异常:
[error] MissingResourceException: : Can't find bundle for base name com/sun/rowset/RowSetResourceBundle, locale en_CA (null:-1)
[error] com.sun.rowset.JdbcRowSetResourceBundle.<init>(Unknown Source)
[error] com.sun.rowset.JdbcRowSetResourceBundle.getJdbcRowSetResourceBundle(Unknown Source)
[error] com.sun.rowset.CachedRowSetImpl.<init>(Unknown Source)
[error] test.DatabaseTest$$anonfun$1$$anonfun$apply$1.apply(DatabaseTest.scala:10)
[error] test.DatabaseTest$$anonfun$1$$anonfun$apply$1.apply(DatabaseTest.scala:9)
更新:build.sbt
内容:
scalacOptions ++= Seq("-deprecation", "-unchecked", "-feature")
scalaVersion := "2.10.3"
scalacOptions ++= Seq("-Yrangepos")
javacOptions ++= Seq("-source", "1.6", "-target", "1.6", "-Xlint:deprecation", "-Xlint:unchecked")
libraryDependencies in ThisBuild ++= Seq(
"postgresql" % "postgresql" % "9.1-901.jdbc4" withSources(),
"org.specs2" %% "specs2" % "2.3.7" withSources()
)
lazy val root = project.in(file("."))
答案 0 :(得分:2)
使用SBT运行ScalaTest时出现此问题。在IntelliJ中,测试运行干净,但在SBT中,CachedRowSet的后期绑定实现未得到解决,并引发了以下异常,
MissingResourceException ::无法找到基本名称的包 com / sun / rowset / RowSetResourceBundle,locale en_GB
问题似乎是SBT线程没有解析运行时类加载回JVM(缺少的资源由rt.jar和resources.jar提供)。 这可以通过强制SBT线程为每个测试分叉新线程来解决,方法是将以下指令放入SBT构建文件的主体中,
fork in Test := true
答案 1 :(得分:0)
CachedRowSetImpl是某些JDK运行时版本的内部类,但不是JDK的正式部分。你可以告诉它是内部的,因为它的包以“com.sun”开头,而不是“java”。你的Windows机器可能有一个完全不同的JDK缺少这个内部类。
我强烈建议避免使用“com.sun”类,并找到使用现有JDK完成工作的惯用方法。
答案 2 :(得分:0)
如果您使用 Java 7 ...
从Java 7开始,很少classes和methods可以保护您免受像您这样的错误的影响。针对接口进行开发(在提供商的帮助下),生活变得更加容易。
import org.specs2.mutable.SpecificationWithJUnit
import javax.sql.rowset._
class DatabaseTest extends SpecificationWithJUnit {
"CachedRowSet Test" should {
"Create a new CachedRowSetImpl instance" in {
val rsf = RowSetProvider.newFactory
val rowSet: CachedRowSet = rsf.createCachedRowSet
rowSet must_!= null
}
}
}
使用Specs2测试,test
对我来说很好。
> test
[info] DatabaseTest
[info]
[info] CachedRowSet Test should
[info] + Create a new CachedRowSetImpl instance
[info]
[info] Total for specification DatabaseTest
[info] Finished in 41 ms
[info] 1 example, 0 failure, 0 error
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1
BTW:JRE中缺少的资源位于lib/resources.jar
,但无法弄清楚为什么它们被报告为丢失(即使它们最终位于项目的lib
目录中)。< / p>
答案 3 :(得分:0)
遇到同样的问题。不是Scala,而是Java。
com.sun.rowset.JdbcRowSetResourceBundle
使用上下文类加载器加载资源。
在我的情况下,上下文类加载器是URLClassLoader
。
它看起来像URLClassLoader
的一个非常奇怪的限制 - 在查找资源时它不会查询父类加载器,它只检查自己的URL列表。
希望有所帮助。