java - 使用自定义类路径使用 GraalVM native 镜像命令行?

标签 java jar graalvm graalvm-native-image

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

我已经尝试了一切我能想到的方法来度过我的第一堂缺课,但无济于事。这对我来说是一种基本的东西,我离得太近而看不到森林,因为路上有三次被诅咒的树。

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

我正在尝试使用来自(以及其他地方)jar A 的类来构建 jar D。 foo.bar.A.P 是它找不到的第一个类,这会将其踢出或进行后备构建。

我尝试了目录的相对路径: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

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

  • native-image -cp ... -jar D
  • native-image -classpath ... -jar D
  • native-image --class-path ... -jar D

我什至尝试通过 gradle 的 jar { manifest { attribute: ( "Class-Path": "...") } } 将类路径添加到 D.jar 的 MANIFEST.MF。它位于工作 "Main-Class": "foo.bar.D.baz" 属性旁边的同一位置。

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

请注意,我没有在这里尝试所有可能的组合/排列。 --class-path 包含 X、Y,但不包含 Z。

我错过了什么?如果有人可以发布一个已知良好的命令行(最好是 Windows),我将非常感激。

最佳答案

首先要尝试的是让命令行在没有 native 镜像的情况下工作,仅使用纯 java。

java启动器的功能类似,native-image不支持混合-jar-cp 如果传递 -jar,它将覆盖类路径,并且 -cp 参数将被忽略。

您避免使用-jar并简单地传递主类的名称:

native-image -cp ...;D foo.bar.D.baz

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

JAR 中的 Class-Path 属性应该有效(在这种情况下,您不需要传递 -cp),但您需要注意此属性中的路径已解析:它们将相对于包含该属性的 jar 的位置进行解析。

关于java - 使用自定义类路径使用 GraalVM native 镜像命令行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61212087/

相关文章:

java - Amazon EC2 上的 Neo4j - 无法从远程机器访问

java - 使用java编写大型excel文件的API

java - 为什么这段代码如何使用 geotools 读取 shapefile 会抛出此异常?

java - Ice4j 源中的错误 : Duplicate Methods

java - 是否可以将 jar 文件嵌入到 Flex 应用程序中?

java - jar 包装和分发

Java w/maven : getting sources from a jar file

java - GraalVM native 镜像会提高整体应用程序性能还是仅减少启动时间?

java - 如何在IDE中附加graalvm-ce-19.2.0源代码?

java - 如何在 Eclipse 中使用 GraalVM (SubstrateVM) 将 Java 编译为 Native