当我使用Eclipse导入编写的代码并将其作为java应用程序运行时,我在运行就绪代码中得到一个异常
这是错误......
Exception in thread "main" java.lang.NoSuchMethodError: backtype.storm.topology.TopologyBuilder.setBolt(Ljava/lang/String;Lbacktype/storm/ topology/IBasicBolt;Ljava/lang/Integer;)Lbacktype/storm/topology/BoltDeclarer;
at TopologyMain.main(TopologyMain.java:18)
代码是
import spouts.WordReader;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;
import bolts.WordCounter; import bolts.WordNormalizer;
public class TopologyMain { public static void main(String[] args) throws InterruptedException {
//Topology definition
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("word-reader",new WordReader());
builder.setBolt("word-normalizer", new WordNormalizer()).shuffleGrouping("word-reader");
builder.setBolt("word-counter", new WordCounter(),1).fieldsGrouping("word- normalizer", new Fields("word"));
//Configuration
Config conf = new Config();
conf.put("wordsFile", args[0]); onf.setDebug(false);
//Topology run
conf.put(Config.TOPOLOGY_MAX_SPOUT_PENDING, 1);
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("Getting-Started-Toplogie", conf, builder.createTopology());
Thread.sleep(1000); cluster.shutdown();
}
}
答案 0 :(得分:1)
可能你已经修改了你的TopologyBuilder
班级或JAR。因为这种错误意味着类的编译时和运行时版本不同,即.class在编译程序后以某种方式被修改。特别是,程序是使用setBolt()
方法编译的,之后,该方法在.class中删除,重命名或修改
答案 1 :(得分:0)
您作为builder.setBolt("word-counter", new WordCounter(),1).fields...()
传递的程序和方法参数是正确的。只要JDK版本集为1.5或更高,方法签名builder.setBolt(String id,IBasicBolt bolt,Number parallelism_hint)就应该接受您传递的参数。
从Java版本1.5 Autoboxing feature开始,导入的.class或编译类应解析从原始int到java.lang.Integer
到java.lang.Number
的引用,因为java.lang.Number
是超类。
主要问题可能是项目或工作区设置中设置的JDK 1.4或更低版本。将JDK版本更改为1.5或更高版本可以解决此问题。
答案 2 :(得分:0)
添加以下maven依赖
<dependency>
<groupId>storm</groupId>
<artifactId>storm</artifactId>
<version>0.8.2</version>
</dependency>