将Quarkus应用程序编译为DLL(库)


能否将Quarkus应用程序编译为DLL?

我有一些用Quarkus用Java编写的代码,它可以在windows上编译成.exe,如果能够在Visual C++中从我的本地应用程序调用该代码,那将非常有用,所以如果Quarkus应用程序可以编译成DLL,那么我就可以这么做了。

Quarkus提供了许多有用的库,这些库可以从编译为本机的Java代码中使用。

Quarkus使用GraalVM原生图像技术将应用程序编译为原生二进制文件。

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

你可以在这篇关于GraalVM的博客文章中看到一个如何做到这一点的小例子。或者在这个文档中,展示了如何将Java代码编译到共享库(并通过JNI使用它(:https://www.graalvm.org/reference-manual/native-image/ImplementingNativeMethodsInJavaWithSVM/#create-a共享库当然,您不必通过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方法作为入口点,并在开始调用其他公开的方法之前调用它。这将(我认为(初始化应用程序,进行依赖注入连接,等等。这通常对库来说是不必要的,但由于应用程序生命周期是由框架管理的,所以你可能需要这样做。

最新更新