网上有很多使用eclipse编辑storm的,但是我觉得eclipse界面不太友好,于是毅然使用intellij IDEA来编辑
但是直接无脑导入会有各种各样奇葩的报错,于是我在解决了问题之后与大家分享我的经验:
这篇博客分为三部分:
1.导入eclipse的storm项目
2.创建一个storm项目
3.后言
一:导入eclipse的storm项目:
1.就事论事
从学长那里拿到了一个之前eclipse上跑的很6的项目,于是开始导入:
无脑的跑一下发现出现问题:
这里是java.lang.NoClassDefFoundError: backtype/storm/generated/AlreadyAliveException,我的是AlreadyAliveException类有问题,不过有的小伙伴可能是IRichBolt这个类,不过都是可以解决的啦
既然我是AlreadyAliveException类有问题,于是我定位到AlreadyAliveException.java下,一打开文件我自己都吓傻了:
但是仔细观察,发现频频出现thrift单词的问题,于是上网查阅资料后,在pom.xml中配置了一下:
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.3</version>
</dependency>
然后看到IDEA右下角出现弹窗:
点击第一项导入变化后,再看AlreadyAliveException文件,报错只有一项了:
其实这个报错我束手无策,因为查看官方源代码后得知,官方就是这样的啊,我能怎么办呢?
2.换一个角度看问题:
我之前忽略了报错的原因:
java.lang.NoClassDefFoundError,这个报错是因为Java虚拟机在编译时能找到合适的类,而在运行时不能找到合适的类导致的错误.想想java的基础知识,编译的时候要编译.java的文件为.class文件,而运行的时候是要执行.class文件的,所以我猜测问题就出在编译的问题上.java虚拟机是本身不应该出错的,那么可能是某些代码出现了疏忽.
于是我仔细检查配置文件:pom.xml
终于发现了问题:
看到了这里面的这条代码了么?
<scope>provided</scope>
provided 意味着打包的时候可以不会包进去,简而言之,就是项目在运行的时候会被认为跑项目的时候会有第三方提供这个包,发布的时候就不需要辛苦打包了,于是呢,在真正运行的时候发现怎么没人提供这个呀,于是虚拟机抛出错误.发现问题后,把pom.xml中所有的
<scope>provided</scope>
都删除,就可以运行了:
打印了好多日志,表明运行成功了!
拥抱曙光啊!!
二:创建Storm项目
想创建Storm项目其实与eclipse大致相同,为了不暴露我菜鸟的气息,我从github上截了一张图:
上面有详细的说明,大家可以看看哟~(滑稽脸)
github上的具体地址是:https://github.com/apache/storm/tree/master/examples/storm-starter#intellij-idea
后言:
网上也有很多说AlreadyAliveException是因为classpath没有配置正确,虽然可能性比较低,如果是初学者,也可以先检查一下自己的classpath,如果是老油条就希望您们能够多写博客,使得我们这些后生晚辈不会在这种匪夷所思的问题上花费大量时间(触景生情,捂脸痛哭流涕中........)