storm启动spring项目Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd'处理

转载地址:http://m.blog.csdn.net/blog/houyefeng/44200995#


问题描述

最近在将开发的storm应用发布到storm集群上,应用启动时遇到“Failed to read schema document 'http://code.alibabatech.com/schema/dubbo/dubbo.xsd'”异常,导致不能正常启动,而在本地集群运行时一切正常。

项目描述

此项目是一个在storm下运行的maven项目,项目中用到了spring、dubbo、hbase等,通过maven的maven-assembly-plugin插件将项目依赖的jar打到一个jar中。

问题解决

用maven-shade-plugin替换maven-assembly-plugin插件进行打包,相关的pom配置代码如下:

<plugins>

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>com.emar.adx.yiqifa.ordercenter.business.handler.confirm.ConfirmOrderTopology</Main-Class>
</manifestEntries>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer  implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>

</plugins>

问题分析

从上面的异常信息看是在spring启动时找不到dubbo的schema文件,问题的关键点就在这儿。

spring启动时是如何找schema文件的?

为什么在本地能找到dubbo的schema文件而程序打包后运行就找不到呢?

弄明白了以上两个问题这个问题就可以解决了。

首先要弄明白spring是怎么找schema文件的,spring是通过spring.schemas和spring.handlers来找schema文件的,spring.schemas文件中有类似的内容:

http\://www.springframework.org/schema/tx/spring-tx-3.2.xsd=org/springframework/transaction/config/spring-tx-3.2.xsd
http\://www.springframework.org/schema/tx/spring-tx-4.0.xsd=org/springframework/transaction/config/spring-tx-4.0.xsd
http\://www.springframework.org/schema/tx/spring-tx.xsd=org/springframework/transaction/config/spring-tx-4.0.xsd

看来spring是将schema文件的url地址和本地路径做了个映射,这也就是为什么在断网的情况下spring项目依然能运行的原因,spring查找schema文件的过程见spring的源码,这里不详细说明。


通过访问http://code.alibabatech.com/schema/dubbo/dubbo.xsd发现此站点已经不能访问,根据spring查找schema的规律,dubbo.xsd肯定在jar包中,于是在dubbo-2.5.3.jar(我用的是这个包,如果用的是其他版本请根据实际情况查看相应的jar)找找看,在包的META-INF目录下发现了spring的spring.schemas、spring.handlers和dubbo.xsd3个文件,这就能很好的解释为什么在本地集群测试时能正常运行了,在本地集群运行时spring通过dubbo的spring.schemas文件找到了dubbo.xsd文件。


通过本地集群运行和在storm上运行的区别可以发现,最大的不同点是在本地集群运行时不需要将所有依赖的jar包装到一个jar包中,而发布到storm时需要将所有依赖的包打到一个jar中,问题应该出在打jar包的过程中;通过检查发布的jar包发现,包中确实没有dubbo.xsd。


到此问题已经非常明朗了,问题就出在maven的打包插件maven-assembly-plugin上,经查找资料发现assembly将多个jar合并到一个jar中时,如果不同的jar中有同名的文件时会导致文件内容的丢失,丢失内容有一定的不确定性。

注:此问题不只出现在storm上部署应用时,在所有需要将依赖包的jar合并成一个jar发布的应用中都有可能出现。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值