Java集成PDAL时执行uname命令报错,求解决方案
Java中使用PDAL时
uname命令执行错误问题 环境与配置
我按照PDAL的Java文档进行开发,已在pom.xml中添加以下依赖:
<dependency> <groupId>io.pdal</groupId> <artifactId>pdal-native</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>io.pdal</groupId> <artifactId>pdal_3</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>io.pdal</groupId> <artifactId>pdal-scala_2.13</artifactId> <version>2.7.0</version> </dependency>
使用的Java代码如下:
Pipeline pipeline = new Pipeline(json, LogLevel.Info()); //该行报错 pipeline.execute();
报错信息
运行时抛出异常:
java.lang.RuntimeException: Error running
unamecommand
完整堆栈跟踪:
java.lang.RuntimeException: Error running `uname` command at scala.sys.package$.error(package.scala:27) ~[scala-library-2.13.13.jar:na] at com.github.sbt.jni.syntax.NativeLoader$.liftedTree1$1(NativeLoader.scala:21) ~[sbt-jni-core_3-1.7.0.jar:1.7.0] at com.github.sbt.jni.syntax.NativeLoader$.loadPackaged$1(NativeLoader.scala:22) ~[sbt-jni-core_3-1.7.0.jar:1.7.0] at com.github.sbt.jni.syntax.NativeLoader$.load$1(NativeLoader.scala:56) ~[sbt-jni-core_3-1.7.0.jar:1.7.0] at com.github.sbt.jni.syntax.NativeLoader$.load(NativeLoader.scala:59) ~[sbt-jni-core_3-1.7.0.jar:1.7.0] at com.github.sbt.jni.syntax.NativeLoader.<init>(NativeLoader.scala:6) ~[sbt-jni-core_3-1.7.0.jar:1.7.0] at io.pdal.Pipeline$.<init>(Pipeline.scala:50) ~[pdal_3-2.7.0.jar:2.7.0] at io.pdal.Pipeline$.<clinit>(Pipeline.scala:50) ~[pdal_3-2.7.0.jar:2.7.0] at io.pdal.Pipeline.<init>(Pipeline.scala:30) ~[pdal_3-2.7.0.jar:2.7.0] at io.pdal.Pipeline.<init>(Pipeline.scala:33) ~[pdal_3-2.7.0.jar:2.7.0] at com.lidarapidemo.lidarprocessing.LidarProcessor.streamPointCloudPostgis(LidarProcessor.java:100) ~[classes/:na] at com.lidarapidemo.controllers.LidarController.lambda$pointsInBoundingBox$0(LidarController.java:39) ~[classes/:na] at org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBodyReturnValueHandler$StreamingResponseBodyTask.call(StreamingResponseBodyReturnValueHandler.java:110) ~[spring-webmvc-6.1.11.jar:6.1.11] at org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBodyReturnValueHandler$StreamingResponseBodyTask.call(StreamingResponseBodyReturnValueHandler.java:97) ~[spring-webmvc-6.1.11.jar:6.1.11] at org.springframework.web.context.request.async.WebAsyncManager.lambda$startCallableProcessing$4(WebAsyncManager.java:348) ~[spring-web-6.1.11.jar:6.1.11] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na] 2024-08-13T12:15:25.380+05:30 ERROR 2384 --- [lidarapidemo] [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Async processing failed: java.lang.ExceptionInInitializerError] with root cause java.lang.RuntimeException: Error running `uname` command at scala.sys.package$.error(package.scala:27) ~[scala-library-2.13.13.jar:na] at com.github.sbt.jni.syntax.NativeLoader$.liftedTree1$1(NativeLoader.scala:21) ~[sbt-jni-core_3-1.7.0.jar:1.7.0] at com.github.sbt.jni.syntax.NativeLoader$.loadPackaged$1(NativeLoader.scala:22) ~[sbt-jni-core_3-1.7.0.jar:1.7.0] at com.github.sbt.jni.syntax.NativeLoader$.load$1(NativeLoader.scala:56) ~[sbt-jni-core_3-1.7.0.jar:1.7.0] at com.github.sbt.jni.syntax.NativeLoader$.load(NativeLoader.scala:59) ~[sbt-jni-core_3-1.7.0.jar:1.7.0] at com.github.sbt.jni.syntax.NativeLoader.<init>(NativeLoader.scala:6) ~[sbt-jni-core_3-1.7.0.jar:1.7.0] at io.pdal.Pipeline$.<init>(Pipeline.scala:50) ~[pdal_3-2.7.0.jar:2.7.0] at io.pdal.Pipeline$.<clinit>(Pipeline.scala:50) ~[pdal_3-2.7.0.jar:2.7.0] at io.pdal.Pipeline.<init>(Pipeline.scala:30) ~[pdal_3-2.7.0.jar:2.7.0] at io.pdal.Pipeline.<init>(Pipeline.scala:33) ~[pdal_3-2.7.0.jar:2.7.0] at com.lidarapidemo.lidarprocessing.LidarProcessor.streamPointCloudPostgis(LidarProcessor.java:100) ~[classes/:na] at com.lidarapidemo.controllers.LidarController.lambda$pointsInBoundingBox$0(LidarController.java:39) ~[classes/:na] at org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBodyReturnValueHandler$StreamingResponseBodyTask.call(StreamingResponseBodyReturnValueHandler.java:110) ~[spring-webmvc-6.1.11.jar:6.1.11] at org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBodyReturnValueHandler$StreamingResponseBodyTask.call(StreamingResponseBodyReturnValueHandler.java:97) ~[spring-webmvc-6.1.11.jar:6.1.11] at org.springframework.web.context.request.async.WebAsyncManager.lambda$startCallableProcessing$4(WebAsyncManager.java:348) ~[spring-web-6.1.11.jar:6.1.11] at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) ~[na:na] at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) ~[na:na] at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ~[na:na] at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
问题
uname命令不在我的pipeline配置JSON中,不清楚它的来源,请问我遗漏了什么配置?
解决方案
原因分析
从堆栈跟踪可以看到,uname命令是由sbt-jni库在加载JNI本地库时调用的——它需要通过该命令判断当前操作系统类型,从而加载对应平台的PDAL本地库。这个命令是类Unix系统(Linux/macOS)下的标准命令,Windows系统默认没有这个命令,这是报错的核心原因。
解决步骤
- 切换运行环境:如果可能,将程序部署到Linux或macOS环境下运行,这类系统原生支持
uname命令,能正常加载PDAL的JNI库。 - 精简依赖:你的pom中包含了scala相关依赖(
pdal_3、pdal-scala_2.13),若只是纯Java开发,可尝试只保留pdal-native依赖,避免scala相关的JNI加载逻辑带来的问题。 - Windows环境适配:
- 手动添加
uname命令:可以通过Git for Windows、Cygwin等工具给Windows添加类Unix命令集,并将其路径加入系统PATH环境变量。 - 指定本地库路径:如果已经有Windows版本的PDAL本地库(
.dll文件),可以通过JVM参数-Djava.library.path=你的本地库路径来指定加载路径,跳过自动检测逻辑。
- 手动添加
- 检查PDAL版本兼容性:确认你使用的PDAL 2.7.0版本的Java绑定是否支持当前运行系统,若Windows支持不佳,可尝试切换到更稳定的版本。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

