使用自定义类路径使用 GraalVM 本机图像命令行?

Working GraalVM native-image command line with custom classpath?

我正在进行的一个项目目前构建了 26 个 jar(如果我们计算仅用于测试的 jar,则为 +6)。出于性能原因,我们希望将它们全部组合成一个可执行文件。这是在 windows 机器上,带有 graalVM-ce-java11-20.0.0。我们正在使用 IntelliJ 和 gradle。在我尝试在 gradle 中重现它之前,我目前只是想出一个可以工作的命令行。 Gradle 还没有出现在图片中,因此缺少合适的标签。

我已经尝试了所有我能想到的方法来克服我的第一次失踪 class,但无济于事。这让我觉得这是一些基本的东西,我离它太近了,而且由于路上有三次被诅咒的树,所以看不到森林。

我目前在 graalvm/bin 文件夹中拥有所有 jar。那应该很容易,对吧?没那么多。

我正在尝试构建 jar D,使用来自(以及其他地方)jar A 的 classes。foo.bar.A.P 是它找不到的第一个 class,将其踢出或回退构建。

我试过目录的相对路径:native-image -cp ./ -jar D

我试过目录的完整路径:native-image -cp c:/foo/bar/baz -jar D

我已经尝试了有问题的 jar 的完整路径:native-image -cp c:/graalvm/bin/A.jar -jar D

我已经尝试了 class 路径的所有别名:

我什至尝试通过 gradle 的 jar { manifest { attributes: ( "Class-Path": "..." ) } } 添加 class 到 D.jar 的 MANIFEST.MF 的路径。这是在同一个地方的工作 "Main-Class": "foo.bar.D.baz" 属性旁边。

我是不是碰巧遇到了 native-image 自动忽略的一个目录(它自己的 bin 文件夹?)让我们找出答案!不,这也没有帮助。

请注意,我没有在这里尝试所有可能的 combinations/permutations。 --class-path 有 X、Y,但没有 Z。

我错过了什么?如果有人可以 post 一个已知良好的命令行(最适合 windows),我将不胜感激。

首先要尝试的是让命令行在没有原生图像的情况下工作,只需使用普通 java.

java 启动器的功能类似,native-image 不支持混合使用 -jar-cp 如果您传递 -jar,它将覆盖classpath 和 -cp 参数将被忽略。

您避免使用 -jar 并简单地传递主要 class:

的名称
native-image -cp ...;D foo.bar.D.baz

(我在这里假设 D 是你的 jar 的完整路径)

JAR 中的 Class-Path 属性应该可以工作(在这种情况下您不需要传递 -cp)但是您需要注意该属性中的路径是如何解析的:它们将相对于包含该属性的 jar 的位置进行解析。