You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 08:42:43