Maven环境下运行OR-Tools Java示例遇UnsatisfiedLinkError问题求助
解决OR-Tools Java运行时
UnsatisfiedLinkError: no jniortools in java.library.path问题 我来帮你搞定这个问题!你遇到的情况其实是OR-Tools Java绑定的一个常见特性——它不是纯Java实现的,而是依赖JNI(Java Native Interface)调用底层的C++求解器库,所以光加Maven依赖是不够的,得把原生库也配置好。
为什么会出现这个错误?
OR-Tools的ortools-java Maven包只包含Java层的封装代码(比如你用到的MPSolver类),但真正做求解工作的核心逻辑是C编写的,jniortools就是连接Java和C的中间原生库(Windows下是.dll,Linux是.so,macOS是.dylib)。Maven中央仓库的jar包不会自动包含这个原生库,所以运行时JVM找不到它,就抛出了UnsatisfiedLinkError。
解决步骤
1. 找到你构建好的jniortools原生库
你已经通过CMake完成了OR-Tools的构建,这个原生库应该在你的OR-Tools构建目录里,通常路径类似:
- Linux/macOS:
ortools/build/java/libjniortools.so(或.dylib) - Windows:
ortools\build\java\jniortools.dll
先确认这个文件存在,记好它的路径。
2. 方法一:运行时手动指定库路径
最简单的测试方法是运行Java程序时,通过-Djava.library.path参数告诉JVM原生库的位置。比如:
# Linux/macOS java -Djava.library.path=/path/to/ortools/build/java -cp target/your-project-1.0-SNAPSHOT.jar com.walmartlabs.services.core.engine.ortools.OrToolSolver # Windows java -Djava.library.path=C:\path\to\ortools\build\java -cp target\your-project-1.0-SNAPSHOT.jar com.walmartlabs.services.core.engine.ortools.OrToolSolver
把路径换成你实际的原生库所在目录即可。
3. 方法二:用Maven自动配置(更优雅,适合开发)
如果不想每次运行都手动输路径,可以配置Maven插件自动复制原生库到项目目录,并在运行时自动指定路径。修改你的pom.xml,添加以下构建配置:
<build> <plugins> <!-- 复制原生库到项目target目录 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>copy-native-libs</id> <phase>process-resources</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/native-libs</outputDirectory> <resources> <resource> <!-- 替换成你的jniortools所在目录 --> <directory>/path/to/ortools/build/java</directory> <includes> <include>jniortools.*</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin> <!-- 用exec插件运行程序,自动带上库路径参数 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>3.1.0</version> <configuration> <mainClass>com.walmartlabs.services.core.engine.ortools.OrToolSolver</mainClass> <arguments> <argument>-Djava.library.path=${project.build.directory}/native-libs</argument> </arguments> </configuration> </plugin> </plugins> </build>
配置好之后,直接用命令运行即可:
mvn exec:java
4. 注意事项
- 确保原生库的架构和你的JVM一致:比如你用的是64位JDK,构建OR-Tools时也要用64位的CMake配置,否则会出现加载失败。
- 如果是Windows系统,要确保
jniortools.dll依赖的其他C++运行库(比如Visual Studio的运行时库)已经安装,不然也会加载失败。
内容的提问来源于stack exchange,提问作者TheWatch
相关产品推荐
相关产品推荐

