问题描述:
通过storageClient去scan vertex和edge数据时,报错:Method threw ‘java.lang.UnsatisfiedLinkError’ exception.
问题原因:
报错入口方法为 Processor.process(spaceName, response),该方法内需要创建RowReader对象,该对象调用JNI接口,需要加载动态链接库 NativeUtils.loadLibraryFromJar("/libnebula_codec.so", NebulaCodec.class),但我链接时失败。
查看本地mvn仓库中~/com/vesoft/nebula/nebula-utils.jar包中的so文件, 通过"file libnebula_codec.so" 查看文件信息,发现该so文件在mac机器上无法使用。
目前nebula不支持mac环境下运行。
解决:见三楼回复
2 个赞
nicole
2020 年10 月 26 日 02:01
3
由于java-client读取数据需要调用编解码的动态链接库nebula_codec,而在maxos环境下是无法应用github源码中的libnebula_codec.so(因为该库是在linux下打成的),所以想要在mac下带用需要重新在mac环境中编译出动态链接库。
步骤:
一、 拉取nebula最新代码,上面已经更新了cmakeList
二、 安装cmake、glog、gflags、gtest 安装过程参考 spark reader 运行报错 - #5,来自 jude-zhu 帖子中@jude-zhu小姐姐的回复。
三、 在mac下编译nebula_codec。 进入nebula源代码的nebula/src/jni目录下:
• mkdir build && cd build
• cmake …
• make java_lib
编译好之后在build/src中会生成 libnebula_codec.dylib文件,该文件便是mac下的动态链接库。
四、 编译nebula-util jar包
由于java-client依赖nebula-util包进行数据编解码,所以需要重新编译打包nebula-util,目的是将libnebula_codec.dylib打到nebula-util的jar包中。
进入nebula源代码的nebula/src/jni/java目录下,修改当前目录下pom.xml中动态链接库名称(后面在编译库时可以统一生成的动态库的后缀名,就不用改代码了)
修改NebulaCodecResourceLoader.java文件中的NEBULA_LIB_NAME名
public class NebulaCodecResourceLoader {
private static final String NEBULA_LIB_NAME = "/libnebula_codec.dylib";
private static final Logger LOGGER = LoggerFactory.getLogger(NebulaCodec.class.getName());
在当前目录下执行maven打包命令
mvn clean package
打包结束后会在nebula/src/jni/java/target目录下生成nebula-utils-1.0.0-rc4.jar
之后在 nebula/src/jni/java/target 目录下执行以下命令,将jar包install到maven私服仓库。
mvn install:install-file -Dfile=nebula-utils-1.0.0-rc4.jar -DgroupId=com.vesoft -DartifactId=nebula-utils -Dversion=1.0.0-rc4 -Dpackaging=jar
五、 修改java-client中的动态库名并打包
修改RowReader.java中的动态库名
NativeUtils.loadLibraryFromJar("/libnebula_codec.dylib", NebulaCodec.class);
修改java-client的pom中nebula-utils依赖包的版本,修改为第3.4步打出来的nebula-utils-1.0.0-rc4.jar的版本
在java-client目录下maven打包
mvn clean compile package
====这样就可以在maxos下调用java-client了。
1 个赞
henson
2020 年11 月 11 日 09:30
4
您好,your-nebula-utils.jar 这个在哪生成的
nicole
2020 年11 月 11 日 10:47
6
这个jar是在nebula源代码的nebula/src/jni/java目录下 执行
mvn install:install-file -Dfile=your-nebula-utils.jar -DgroupId=com.vesoft -DartifactId=nebula-utils -Dversion=1.0.0-rc4 -Dpackaging=jar
生成的。 生成的jar包在nebula/src/jni/java/target中
henson
2020 年11 月 11 日 11:06
7
这个命令的目的是生成nebula-utils-1.0.0-rc4.jar
nicole:
这个jar是在nebula源代码的nebula/src/jni/java目录下 执行
mvn install:install-file -Dfile=your-nebula-utils.jar -DgroupId=com.vesoft -DartifactId=nebula-utils -Dversion=1.0.0-rc4 -Dpackaging=jar
生成的。 生成的jar包在nebula/src/jni/java/target中
这个用的又是nebula-utils-1.0.0-rc4.jar
我执行完以下命令时候这个文件就生成了
nicole
2020 年11 月 11 日 12:27
8
执行完 make命令后生成的jar包是未改动态链接库的包,没法在mac下使用的,这一步目的是在mac下生成新的动态库文件。
你看下帖子我加了个mvn clean package的步骤,这一步目的是打成nebula-utils-1.0.0-rc4.jar,
mvn install目的是将jar包安装到maven本地仓库,这样在nebula-client中才能引入该包的依赖。
1 个赞
walren
2021 年4 月 19 日 11:16
10
walren:
看了下报错,定位是需要需java对应目录找jni文件,我的java没有include文件,是需要专门特殊添加吗