我在SBT下有多模块项目。
工程A
(库)的reference.conf
文件中包含A
的配置参数。A
项目依赖于akka-actor
库,它附带了自己的reference.conf
文件。Project A
在自己的reference.conf
中重新定义了akka
的一些参数。
项目B
依赖于A
。
当我在B
中调用ConfigFactory.load()
时,我得到了reference.conf
合并的错误顺序。它首先获取A
的配置,然后在其上应用akka-actor
的配置。最后,我得到了akka-actor
的初始配置。
我该如何修复它?我需要得到akka-actor
的配置加载第一,然后我的A
的配置应该适用于它。
好的,看起来我已经在ConfigFactory
的来源中找到了答案。
所有的reference.conf
都通过ClassLoader.getResources
加载。它返回java.util.Enumeration[URL]
。这个enum中URL
s的顺序就是这个问题的答案。因此,您需要做的是:确保reference.conf
资源在此枚举中的顺序正确排列。
下面是如何做到这一点的一个例子。首先,通过重写getResources
方法创建您自己的ClassLoader
版本:
import scala.collection.JavaConverters._
class CustomClassLoader(loader: ClassLoader) extends ClassLoader(loader){
override def getResources(name: String): util.Enumeration[URL] = {
val resources = super.getResources(name).asScala.toList
// arrange resources as you wish here
java.util.Collections.enumeration(resources.asJava)
}
}
最后,用CustomClassLoader
实例调用ConfigFactory
的load
方法。