在 Storm 拓扑 jar 中包含依赖项
Include dependencies in Storm topology jar
我试图在我部署到 Storm 的 jar 中包含我的拓扑所需的一些 jar。当我使用 Ant 和 manifestclasspath 任务创建 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-路径条目中的路径看起来有误。拓扑部署成功,但是当我将数据发送到 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
这也部署成功,但在我尝试传递消息时出现相同的错误。
如何创建包含这些依赖项并在 Storm 上正常运行的 jar 文件?我不想将 jars 添加到 Storm lib 目录,但这是我发现唯一有效的配置。
显然 Matthias 是正确的,Storm 无法处理嵌套的 jar 文件。修复方法是解压 jar 文件并将 class 文件包含在拓扑 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。
我试图在我部署到 Storm 的 jar 中包含我的拓扑所需的一些 jar。当我使用 Ant 和 manifestclasspath 任务创建 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-路径条目中的路径看起来有误。拓扑部署成功,但是当我将数据发送到 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
这也部署成功,但在我尝试传递消息时出现相同的错误。
如何创建包含这些依赖项并在 Storm 上正常运行的 jar 文件?我不想将 jars 添加到 Storm lib 目录,但这是我发现唯一有效的配置。
显然 Matthias 是正确的,Storm 无法处理嵌套的 jar 文件。修复方法是解压 jar 文件并将 class 文件包含在拓扑 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。