【问题标题】:Compile Quarkus application to a DLL (library)将 Quarkus 应用程序编译为 DLL(库)
【发布时间】:2021-06-01 02:47:18
【问题描述】:

可以将 Quarkus 应用程序编译为 DLL 吗?

我有一些用 Quarkus 用 Ja​​va 编写的代码,它可以在 Windows 上编译为 .exe,能够从我的 Visual C++ 中的本机应用程序调用该代码会很有用,所以如果 Quarkus 应用程序可以编译成 DLL 然后我可以这样做。

Quarkus 附带了许多有用的库,可以从 Java 代码编译为原生代码。

【问题讨论】:

    标签: dll quarkus graalvm graalvm-native-image


    【解决方案1】:

    Quarkus 使用 GraalVM native image technology 将应用程序编译为本机二进制文件。

    您可以使用本机映像编译为共享库。例如,GraalVM 发行版包括 GraalVM JIT 编译器,它最初是一个 Java 应用程序,但是当您运行 java 默认情况下,它使用从 JIT 编译器的 Java 代码构建的共享库。这个共享库当然是用原生镜像构建的。

    您可以在这个blogpost about GraalVM 中看到一个小例子来说明如何做到这一点。或者在此文档中展示如何将 Java 代码编译到共享库(并通过 JNI 使用它):https://www.graalvm.org/reference-manual/native-image/ImplementingNativeMethodsInJavaWithSVM/#create-a-shared-library 当然,您不必通过 JNI 使用您的库,而是可以从任何其他语言或环境中使用。

    Michael Simons 的这篇优秀文章介绍了如何将 Neo4j Java 驱动程序构建到共享库并从 C 代码中使用它的示例:https://medium.com/graalvm/3-ways-to-polyglot-with-graalvm-fb28c1542b45(“将 Java 引入 C”部分)。

    简而言之,您可以使用@CEntryPoint 注释标记要公开的方法,并将--shared 标志添加到本机图像选项中。 结果是一个共享库和该库的头文件。

    在使用原生镜像构建的共享库之前需要做一些仪式,即你需要在调用共享库之前创建一个Isolate,你可以通过调用提供的函数来做到这一点:

    int graal_create_isolate(graal_create_isolate_params_t* params, graal_isolate_t** isolate, graal_isolatethread_t** thread);
    

    您可能想要做的另一件事是将main 方法公开为入口点,并在开始调用其他公开的方法之前调用它。这将(我认为)初始化应用程序,进行依赖注入连接,等等。库通常不需要这样做,但由于应用程序生命周期由框架管理,您可能需要这样做。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 2011-06-14
      • 1970-01-01
      相关资源
      最近更新 更多