我正在创建一个风暴拓扑,在其中一个螺栓中使用第三方库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风暴拓扑项目中工作?
答案 0 :(得分:0)
理论上,如果你将任何jar放在风暴的lib
目录中,它将被包含在clssspath中。另一种方法是将所有依赖项打包到要提交给集群的jar中。
答案 1 :(得分:0)
在研究了storm.yaml文件的所有可能配置之后,有一个提供我错过了第一次并且正是我需要解决的问题。添加:
java.library.path: "/opt/MITIE/mitielib"
到storm.yaml并重新启动风暴,一切正常。