我正在为我的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 Test Server。因此,在单元和集成测试快乐运行时,加载主要应用程序配置/ / conf而不是/ test / resources配置似乎加载查找是一个问题。
答案 0 :(得分: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
在那一行上,我觉得类加载器很可能是null吗?它应该来自这里: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
所以有一种理论认为,在抛出异常的情况下,线程没有设置上下文类加载器。我不能告诉你为什么在你的场景中就是这种情况,如果是的话,但也许它是一个领先者。
我认为在任何情况下,typesafe配置都不应该将NPE抛到“迟到”,所以我创建https://github.com/typesafehub/config/issues/155来解决这个问题。然而,它最有可能是游戏中的问题和/或你如何设置线程上下文类加载器为空并且没有为ConfigFactory方法提供其他类加载器。
这假设NPE来自一个空类加载器,我认为这不一定是问题,但从堆栈跟踪看起来似乎是合理的。