在风暴拓扑中使用第三方库时出现java.lang.UnsatisfiedLinkError

时间:2015-01-15 19:01:14

标签: java linux apache-storm

我正在创建一个风暴拓扑,在其中一个螺栓中使用第三方库MITIE。根据文档,MITIE具有一些运行所需的本机库和jar。

它附带了一个示例java类和脚本(run.sh)来运行它,如下所示:

 export LD_LIBRARY_PATH=/opt/MITIE/mitielib
 export CLASSPATH=/opt/MITIE/mitielib/javamitie.jar:.

 javac NerExample.java
 java NerExample

这很有效。然后我修改了〜/ .bashrc文件以包含上面的两个导出,因此我可以运行脚本而不必在那里有这些导出。我从脚本中删除了导出语句,它运行正常。

我的想法是,如果我在〜/ .bashrc中创建这两个导出,那么当我运行我的风暴拓扑时,它应该能够获取库目录并且也可以工作。

问题在于,由于某种原因,当我运行我的风暴拓扑时,它不起作用。我收到以下错误:

java.lang.UnsatisfiedLinkError: no javamitie in java.library.path

我到处寻找答案,并且厌倦了使用我的pom.xml中的surefire maven插件,如下所示:

       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <forkMode>once</forkMode>
                <argLine>-Djava.library.path=${basedir}/lib/mitielib</argLine>
            </configuration>
        </plugin>

但似乎没有任何效果。有谁知道如何让本机库在Java风暴拓扑项目中工作?

2 个答案:

答案 0 :(得分:0)

理论上,如果你将任何jar放在风暴的lib目录中,它将被包含在clssspath中。另一种方法是将所有依赖项打包到要提交给集群的jar中。

答案 1 :(得分:0)

在研究了storm.yaml文件的所有可能配置之后,有一个提供我错过了第一次并且正是我需要解决的问题。添加:

  java.library.path: "/opt/MITIE/mitielib" 

到storm.yaml并重新启动风暴,一切正常。