1

我正在为我的 Play/Scala/Akka 应用程序手动构建类路径,因此我可以使用 ScalaTest 运行程序在 CI 管道的不同阶段测试我的应用程序,而无需重新编译。但是,我收到以下错误:

java.lang.NullPointerException:
  at com.typesafe.config.impl.Parseable$ParseableResources.rawParseValue(Parseable.java:509)
  at com.typesafe.config.impl.Parseable$ParseableResources.rawParseValue(Parseable.java:492)
  at com.typesafe.config.impl.Parseable.parseValue(Parseable.java:171)
  at com.typesafe.config.impl.Parseable.parseValue(Parseable.java:165)
  at com.typesafe.config.impl.Parseable.parse(Parseable.java:204)
  at com.typesafe.config.impl.ConfigImpl$1.call(ConfigImpl.java:368)
  at com.typesafe.config.impl.ConfigImpl$1.call(ConfigImpl.java:365)
  at com.typesafe.config.impl.ConfigImpl$LoaderCache.getOrElseUpdate(ConfigImpl.java:58)
  at com.typesafe.config.impl.ConfigImpl.computeCachedConfig(ConfigImpl.java:86)
  at com.typesafe.config.impl.ConfigImpl.defaultReference(ConfigImpl.java:365)

这是我正在运行的命令:

/usr/lib/jvm/java-7-openjdk//bin/java -Xmx256M -Xms32M -Xbootclasspath/a:$BOOTCP -classpath '""' -Dscala.home=/usr/opt/scala -Dscala.usejavacp=true -jar /home/nick/repos/testrunnnertest/lib/scalatest.jar -R target/scala-2.10/test-classes -o 

$BOOTCP 的值是大量依赖项列表,包括应用程序 jar、.ivy2 中的依赖项以及包含配置文件的文件夹(/conf、/test/resources)。我从 Scala shell 脚本中复制了这个命令。我还使用 $BOOTCP 的值作为 -classpath 的值,但我仍然遇到同样的问题。

仅当我运行启动 Play Framework 测试服务器的验收测试时才会出现此问题。因此,似乎在 /conf 中加载主应用程序配置而不是 /test/resources 配置似乎是在单元和集成测试愉快运行时加载 find 的问题。

4

1 回答 1

1

很晚才提出这个问题,但你有想过吗?哪个类型安全配置版本在您的类路径中?

master 上的第 509 行看起来不太正确:https ://github.com/typesafehub/config/blob/master/config/src/main/java/com/typesafe/config/impl/Parseable .java#L509

所以你可能有一个版本略有不同的来源。

版本 1.0.2 第 509 行看起来可能更有可能:https ://github.com/typesafehub/config/blob/v1.0.2/config/src/main/java/com/typesafe/config/impl/Parseable.java#L509

我猜在那条线上类加载器很可能是空的?它应该来自该跟踪中的此处:https://github.com/typesafehub/config/blob/v1.0.2/config/src/main/java/com/typesafe/config/impl/ConfigImpl.java#L365 其中反过来来自:https ://github.com/typesafehub/config/blob/v1.0.2/config/src/main/java/com/typesafe/config/ConfigFactory.java#L380

因此,一种理论是线程在抛出异常的情况下没有设置上下文类加载器。我不能告诉你为什么在你的场景中会出现这种情况,如果是的话,但也许它是一个线索。

我不认为类型安全配置在任何情况下都应该“延迟”抛出 NPE,所以我创建了https://github.com/typesafehub/config/issues/155来解决这个问题。然而,它很可能最终是一个问题和/或你如何设置线程上下文类加载器为空并且没有其他类加载器提供给 ConfigFactory 方法。

这是假设 NPE 来自一个空类加载器,我认为这不一定是问题所在,但从堆栈跟踪来看似乎是合理的。

于 2014-03-26T20:04:40.623 回答