# Storm異常之RuntimeException: Found multiple defaults.yaml resources
### 異常
今天在運行Storm與Kafka集成的Topology時拋出如下異常:
~~~
java.lang.RuntimeException: Found multiple defaults.yaml resources
at backtype.storm.utils.Utils.findAndReadConfigFile(Utils.java:106)
at backtype.storm.utils.Utils.readDefaultConfig(Utils.java:126)
at backtype.storm.utils.Utils.readStormConfig(Utils.java:146)
at backtype.storm.config$read_storm_config.invoke(config.clj:66)
at backtype.storm.testing$mk_local_storm_cluster.doInvoke(testing.clj:103)
at clojure.lang.RestFn.invoke(RestFn.java:398)
at backtype.storm.LocalCluster$_init.invoke(LocalCluster.clj:10)
at backtype.storm.LocalCluster.<init>(Unknown Source)
at TopologyMain.main(TopologyMain.java:29)
~~~
### 解決方案
搜索了一下依賴包,發現storm-core下面也存在一個defaults.yaml文件。修改Maven配置文件,添加scope屬性并設為provided:
~~~
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>0.9.6</version>
<scope>provided</scope>
</dependency>
~~~
重新打包運行,異常消失。
### 知識點回憶
下面羅列一下scope的使用場景和說明:
> 注:以下內容摘錄自acooly的博客文章 [MAVEN Scope使用](http://acooly.iteye.com/blog/1788890)
**1.compile**
編譯范圍,默認scope,在工程環境的classpath(編譯環境)和打包(如果是WAR包,會包含在WAR包中)時候都有效。
**2.provided**
容器或JDK已提供范圍,表示該依賴包已經由目標容器(如tomcat)和JDK提供,只在編譯的classpath中加載和使用,打包的時候不會包含在目標包中。最常見的是j2ee規范相關的servlet-api和jsp-api等jar包,一般由servlet容器提供,無需在打包到war包中,如果不配置為provided,把這些包打包到工程war包中,在tomcat6以上版本會出現沖突無法正常運行程序(版本不符的情況)。
**3.runtime**
一般是運行和測試環境使用,編譯時候不用加入classpath,打包時候會打包到目標包中。一般是通過動態加載或接口反射加載的情況比較多。也就是說程序只使用了接口,具體的時候可能有多個,運行時通過配置文件或jar包掃描動態加載的情況。典型的包括:JDBC驅動等。
**4.test**
測試范圍,一般是單元測試場景使用,在編譯環境加入classpath,但打包時不會加入,如junit等。
**5.system**
系統范圍,與provided類似,只是標記為該scope的依賴包需要明確指定基于文件系統的jar包路徑。因為需要通過systemPath指定本地jar文件路徑,所以該scope是不推薦的。如果是基于組織的,一般會建立本地鏡像,會把本地的或組織的基礎組件加入本地鏡像管理,避過使用該scope的情況。
**實踐:**
provided是沒有傳遞性的,也就是說,如果你依賴的某個jar包,它的某個jar的范圍是provided,那么該jar不會在你的工程中依靠jar依賴傳遞加入到你的工程中。
provided具有繼承性,上面的情況,如果需要統一配置一個組織的通用的provided依賴,可以使用parent,然后在所有工程中繼承。