【问题标题】:Working GraalVM native-image command line with custom classpath?使用自定义类路径使用 GraalVM 本机映像命令行?
【发布时间】:2020-04-14 16:02:37
【问题描述】:

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

我已经尝试了我能想到的一切来度过我的第一个缺课,但无济于事。这让我觉得这是一个基本的东西,我离得太近了,由于路上所有的三次被诅咒的树都看不到森林。

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

我正在尝试构建 jar D,使用来自(以及其他地方)jar A 的类。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 { attributes: ( "Class-Path": "..." ) } } 将类路径添加到 D.jar 的 MANIFEST.MF。这是在同一个地方工作的"Main-Class": "foo.bar.D.baz" 属性旁边。

我是不是刚刚发生在 native-image 自动忽略的一个目录上(它是自己的 bin 文件夹?)让我们找出答案!不,这也没有帮助。

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

我错过了什么?如果有人可以发布一个已知良好的命令行(理想情况下适用于 Windows),我将不胜感激。

【问题讨论】:

    标签: java jar graalvm graalvm-native-image


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多