在Storm拓扑jar中包含依赖项

时间:2015-09-14 15:05:59

标签: ant jar apache-kafka apache-storm manifest.mf

我正在尝试在我部署到Storm的jar中包含我的拓扑所需的一些jar。当我使用带有manifestclasspath任务的Ant创建jar文件时,我得到一个如下所示的清单:

Ant-Version: Apache Ant 1.9.5
Created-By: 1.8.0_45-b14 (Oracle Corporation)
Main-Class: org.softwarematters.storm.MyTopology
Class-Path: ../build/lib/kafka-clients-0.8.2.1.jar ../build/lib/kafka_
 2.11-0.8.2.1.jar ../build/lib/log4j-1.2.16.jar ../build/lib/metrics-c
 ore-2.2.0.jar ../build/lib/scala-library-2.11.5.jar ../build/lib/stor
 m-kafka-0.9.5.jar ../build/lib/zookeeper-3.4.6.jar

Class-Path条目中的路径看起来不对。拓扑成功部署,但是当我向Kafka发送数据时,我在Storm日志中收到了一个ClassNotFoundException:storm.kafka.KafkaSpout。

我将清单修改为如下所示:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.5
Created-By: 1.8.0_45-b14 (Oracle Corporation)
Main-Class: org.softwarematters.storm.MyTopology
Class-Path: . lib/kafka-clients-0.8.2.1.jar lib/kafka_2.11-0.8.2.1.jar
 lib/log4j-1.2.16.jar lib/metrics-core-2.2.0.jar lib/scala-library-2.1
 1.5.jar lib/storm-kafka-0.9.5.jar lib/zookeeper-3.4.6.jar

这也可以成功部署,但在尝试传递消息时会出现同样的错误。

如何创建包含这些依赖项的jar文件并在Storm上正常运行?我不想将jar添加到Storm lib目录中,但这是我发现的唯一有效的配置。

1 个答案:

答案 0 :(得分:0)

显然Matthias是正确的,Storm无法处理嵌套的jar文件。解决方法是解压缩jar文件并将类文件包含在拓扑jar中。这对我的Ant build.xml文件进行了两次更改。首先,将依赖项放在一个临时目录中,然后从它们构建一个jar:

  <target name="staging">
    <copy todir="${build.staging}">
      <fileset dir="${kafka.lib}">
        <include name="kafka-clients-0.8.2.1.jar"/>
        <include name="kafka_2.11-0.8.2.1.jar"/>
        <include name="log4j-1.2.16.jar"/>
        <include name="metrics-core-2.2.0.jar"/>
        <include name="scala-library-2.11.5.jar"/>
      </fileset>

      <fileset dir="${storm.kafka.lib}">
        <include name="storm-kafka-0.9.5.jar"/>
      </fileset>

      <fileset dir="${zookeeper.lib}">
        <include name="zookeeper-3.4.6.jar"/>
      </fileset>
    </copy>

    <jar jarfile="${staging.jar}">
      <zipgroupfileset dir="${build.staging}" includes="**/*.jar"/>
    </jar>
  </target>

然后将这些.class文件拉入拓扑jar,不包括清单:

<jar basedir="${build.root}"
     jarfile="${topology.jar}">
  <manifest>
    <attribute name="Main-Class" value="${topology.fullname}"/>
  </manifest>

  <zipfileset src="${staging.jar}" excludes="META-INF/**/*"/>
</jar>

这个jar成功部署到Storm。