MissingResourceException:无法找到基本名称com / sun / rowset / RowSetResourceBundle(SBT项目)的包

时间:2014-01-20 17:28:57

标签: scala jdbc intellij-idea sbt

当我尝试创建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("."))

4 个答案:

答案 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开始,很少classesmethods可以保护您免受像您这样的错误的影响。针对接口进行开发(在提供商的帮助下),生活变得更加容易。

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列表。

希望有所帮助。