首页 > 解决方案 > 如何从 Spring Boot maven Web 项目调用 dll 调用?

问题描述

我有 Springboot maven 项目来开发带有嵌入式码头服务器的 Web 应用程序。目标包装是 jar 并且在执行时它需要在 localhost 上侦听。Web 应用程序按预期工作,我能够调用我公开的 Rest API RestController

现在我需要集成一个 SDK(一个独立的 jar)并使用 jar 公开的功能。

jar 是 DLL 的包装器。为了使用它,jar 和 DLL 应该在同一个目录中。它使用 JNI 来公开 DLL 的功能。如何将此 SDK(带 dll 的 jar)集成到我的 maven-springboot 项目中。SDK是普通java项目的输出(不使用maven)?System.load()从嵌入式服务器调用 dll(使用)是否有任何限制?会不会有联动错误?

是否可以将所有内容打包在一个可执行的 jar(依赖的 jar 和 dll)中?

标签: javaspring-bootdlljava-native-interfaceembedded-jetty

解决方案


是否可以将所有内容打包在一个可执行的 jar(依赖的 jar 和 dll)中?

不,任何库(DLL)都必须在文件系统上并像操作系统一样加载。您不能将其隐藏在 JAR 文件中。

至于System.load(),不要使用或依赖于相对路径。你基本上有两个选择。

  1. 使用完全限定的文件系统路径引用。
try {
    System.load("C:/projects/masterpo/grasshopper.dll");
} catch (UnsatisfiedLinkError e) {
    throw new ServletException("Unable to load library");
}
  1. java.library.path在 JVM 启动时使用系统属性。

    这将要求您设置java.library.pathJVM 启动时指向该目录的有效内容C:/projects/masterpo/。(这可能是一个安装步骤)。但是你可以简单地使用......

try {
    System.load("grasshopper");
} catch (UnsatisfiedLinkError e) {
    throw new ServletException("Unable to load library");
}

关于 的使用System.load(),请考虑Runtime.getRuntime().load(name)改为使用。


推荐阅读