【问题标题】:Quarkus Building a Native Executable NoSuchFileException: /projectQuarkus 构建本机可执行文件 NoSuchFileException: /project
【发布时间】:2019-03-15 08:57:23
【问题描述】:

我按照build quarkus native executable 的步骤进行操作。

1.引导项目:

mvn io.quarkus:quarkus-maven-plugin:0.11.0:create \
-DprojectGroupId=org.acme \
-DprojectArtifactId=getting-started \
-DclassName="org.acme.quickstart.GreetingResource" \
-Dpath="/hello"

2.在minishift中使用docker

minishift start
eval $(minishift docker-env)

3.生成包:

mvn package -Pnative -Dnative-image.docker-build=true

失败并出现以下错误跟踪:

[INFO] [io.quarkus.creator.phase.nativeimage.NativeImagePhase] docker run -v /Users/.../quarkus/getting-started/target:/project:z --rm swd847/centos-graal-native-image-rc12 -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy$BySpaceAndTime -jar getting-started-1.0-SNAPSHOT-runner.jar -J-Djava.util.concurrent.ForkJoinPool.common.parallelism=1 -H:+PrintAnalysisCallTree -H:EnableURLProtocols=http -H:-SpawnIsolates -H:-JNI --no-server -H:-UseServiceLoaderFeature -H:+StackTrace
Error: Invalid Path entry getting-started-1.0-SNAPSHOT-runner.jar
Caused by: java.nio.file.NoSuchFileException: /project/getting-started-1.0-SNAPSHOT-runner.jar

根据要求,树输出如下所示:

【问题讨论】:

  • 您能在没有 Minishift 步骤的情况下进行检查吗?我怀疑这与它有关,因为其他一切看起来都像是一个标准的入门项目。
  • 从树上我真的看不出来,有很多输出。您能否还添加ls -l 的输出?谢谢
  • @geoand,请看下文,谢谢$ ls -ltotal 8-rw-r--r-- 1 buhion staff 3704 Mar 16 10:50 pom.xmldrwxr-xr-x 4 buhion staff 128 Mar 16 10:50 srcdrwxr-xr-x 15 buhion staff 480 Mar 16 10:55 target
  • 谢谢,我会调查一下
  • 在使用 Minishift 的 docker 守护程序时,我确实可以重现该错误。但是,当使用本地 docker 守护进程时,一切正常,所以我想说这不是 Quarkus 问题,而是不受支持的用例

标签: quarkus


【解决方案1】:

Quarkus 的 -Dnative-image.docker-build=true 功能仅适用于 local docker 守护进程。

在您的情况下,您使用的是 Minishift 中的 Docker 守护程序和构建文件,因为构建工件不存在于 Minishift VM 中。

更新

现在有一个 Quarkus issue 跟踪这个。

【讨论】:

  • 感谢您对此进行调查。除了本地 docker,我已经测试过这也适用于 minikube docker
  • @yjsa 如果您的目标只是在 Minishift (OpenShift) 上构建原生 Quarkus 应用程序,那么您可能对 github.com/quarkusio/quarkus/pull/1358 中即将提供的 S2I 支持感兴趣?
【解决方案2】:

我认为最好的方法是将创建应用程序镜像和实际编译的过程合并到一个 Dockerfile 中。

您的 Dockerfile 应包含 3 个阶段

  • 构建 java 应用程序
  • 构建原生镜像
  • 构建最终的 Docker 镜像

如果应用程序有编译问题 ++ 构建 jar 文件,则第一阶段是快速失败

第二阶段是通过 native-image 命令从 jar + libs 生成原生镜像,或者如果您使用包含 maven 和 graalvm 的镜像,则可以使用“mvn -Pnative verify”。

第三阶段是基于编译好的原生镜像和alpine或fedora-minimal等最小基础镜像构建最终的Docker镜像

构建应用程序 ++ 构建原生镜像 ++ 构建最终 Docker 镜像的示例 - https://github.com/quarkusio/quarkus-quickstarts/blob/master/getting-started-knative/Dockerfile

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2021-04-27
    • 2011-12-12
    • 2013-01-24
    • 2012-03-16
    • 2019-04-29
    相关资源
    最近更新 更多