java - 如何从 Spring boot maven web 项目调用 dll?

标签 java spring-boot dll java-native-interface embedded-jetty

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

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

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

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

最佳答案

Also is it possible to pack everything in a single executable jar (the depended jar and dll)?

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

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

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

    这需要您在 JVM 启动指向目录 C:/projects/masterpo/ 的有效路径时设置 java.library.path。 (这可能是一个安装步骤)。但随后你可以简单地使用...

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

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

    关于java - 如何从 Spring boot maven web 项目调用 dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56042739/

    相关文章:

    c++ - 从 C 程序使用 Qt 库

    java - 使用 ProcessBuilder 启动 Jar

    java - 更新 Titan 图数据库中的顶点属性的问题

    java - 我无法让这个函数给我所有素数

    java - 如何使用java在Repository Spring Boot中执行将由特定符号分隔的查询

    java - 获取某个日期范围内的记录

    java - 我必须将所有依赖的 DLL 放入 JDK 的 bin 文件夹中吗?

    java - ComboBoxCellEditor - 摆脱文本框?

    java - 在 Spring 中使用 AuthenticationSuccessHandler 重定向登录页面

    c# - C# 的 Unix 横幅库