当前位置: 首页 > 知识库问答 >
问题:

Quarkus映像:无法运行程序“键盘工具”:错误 =2,没有此类文件或目录

唐星晖
2023-03-14

我有一个Java项目,它运行在Java 11上,并使用Quarkus框架。在项目代码中的某个地方有这样一行:

Process proc = Runtime.getRuntime()
                        .exec("keytool -keystore " + trustStore.toString() + " -alias postgresql " + "-storepass \""
                                + trustCredentials.toString() + "\" -noprompt -import -file " + caRoot.toString());

上面一行使用keytools命令将证书添加到信任库。

当试图将我的java项目构建到一个Fast-Jar中,然后运行这个Jar时,问题就出现了。找不到Keytool命令:

java.io.IOException: Cannot run program "keytool": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1128) ~[?:?]
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1071) ~[?:?]
    at java.lang.Runtime.exec(Runtime.java:592) ~[?:?]
    at java.lang.Runtime.exec(Runtime.java:416) ~[?:?]
    at java.lang.Runtime.exec(Runtime.java:313) ~[?:?]

我不太明白为什么会发生这种情况。我知道keytool是随java安装而来的,我已经检查过了,它似乎安装在我的映像上。我也知道路径变量可能需要更新。然而,在Linux机器上(我的映像基于此),keytool安装在/usr/bin下,这已经是路径的一部分。作为另一个测试,我还尝试在java代码中指定keytool的路径,即:

Process proc = Runtime.getRuntime()
                        .exec("/usr/bin/keytool -keystore " ...blah 

但仍然得到相同的错误。也许这个问题可能与quarkus如何构建图像有关?

这就是我在gitlab-ci.yml中构建快速Jar映像的大致方式:

- export JOB_CONTAINER_ID=`docker ps -q -f "label=com.gitlab.gitlab-runner.type=build" -f "label=com.gitlab.gitlab-runner.job.id=$CI_JOB_ID"`
      - export TOKEN=$CI_BUILD_TOKEN
      - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY
      - |
         docker build -t temp-image-builder -f - . << EOF
         FROM ${DIND_BUILD_IMAGE}
         COPY . /project
         EOF
      - docker run --rm --privileged --name=temp-image-builder --user root -w /project
         -v /var/run/docker.sock:/var/run/docker.sock
         -e "CI_PROJECT_DIR=$CI_PROJECT_DIR" -e "TOKEN=$TOKEN" -e "QUARKUS_PROFILE=$QUARKUS_PROFILE" -e "TAG=$TAG"
         -e "IMAGE_NAME=${CI_REGISTRY_IMAGE}/${SERVICE_NAME}:${TAG}" -e "ENFORCE_RELEASE_GATE=on"
         -e "CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME" -e "GITLAB_USER_LOGIN=$GITLAB_USER_LOGIN"
         -e "CI_PROJECT_NAME=$CI_PROJECT_NAME" -e "CI_PROJECT_URL=$CI_PROJECT_URL" -e "CI_JOB_ID=$CI_JOB_ID"
         --entrypoint /bin/bash temp-image-builder:latest '-c'
            '
               ./gradlew -Pversion="${TAG}"
                  clean build
                  -Dquarkus.package.type=fast-jar
                  -Dquarkus.profile="${QUARKUS_PROFILE}"
                  -Dquarkus.jib.base-registry-username=gitlab-ci-token -Dquarkus.jib.base-registry-password="$TOKEN"
                  -Dquarkus.container-image.tag="${TAG}"
                  -Dquarkus.container-image.build=true
            '
      - docker push ${CI_REGISTRY_IMAGE}/${SERVICE_NAME}:${TAG}

${DIND_BUILD_IMAGE} 是另一个基于 java-11 高山图像的图像。

试图解决这个问题真的很令人沮丧,这似乎是一件简单的事情,但我至今没有运气。任何关于什么可能是错误的建议都将受到极大的赞赏。谢谢你。

共有1个答案

安承教
2023-03-14

事实证明,这确实是一个PATH问题。我误以为钥匙工具在usr/bin下。使用这个称为“潜水”的工具,我能够找出键盘工具的位置。不幸的是,我不确定是否有可能使用jib将PATH变量更新到键盘工具所在的位置,但至少我可以运行exec并包含密钥工具路径(即.exec(路径/到/工具/键盘工具...blah)),它将成功运行

 类似资料:
  • 问题内容: 我在Ubuntu 14.04 LTS上进行构建,但得到以下信息: 我假设这是由某些Linux安全功能引起的,该功能阻止了/ var / lib / jenkins / workspace / videovixx的创建,而没有我可能没有的正确权限。这是问题吗,我该如何解决? 问题答案: 这里有很多事情。 您或者没有在Job配置中选择Maven版本。或者您没有配置Jenkins安装Mave

  • 我正在我的Ubuntu 14.04 LTS上进行构建,但我得到了以下信息: 我假设这是由某个linux安全特性导致的,该特性阻止了在没有正确权限的情况下创建/var/lib/Jenkins/workspace/video vixx,而我可能没有正确的权限。这是问题吗,我该怎么解决?

  • 问题内容: 我正在对GitHub上的此示例Angular2应用进行较小的修改,以使其使用Express.js而不是KOA。但是目前,当我尝试在FireFox中加载应用程序时,控制台中会显示以下错误: 当http请求触发路由器处理程序并返回时,Angular2应用程序开始加载,该处理程序返回,然后触发一系列嵌套依赖项的回调,其中一个引发错误并中途停止应用程序加载。 为了解决GitHub示例中的代码需

  • 第一个问题:我得到以下结果: 文件"D:\Anaconda\Lib\site-包\请求\api.py",第70行,在get返回请求('get', url, params=params,**kwargs) 文件"D:\Anaconda\Lib\site-包\请求\api.py",第56行,在请求返回session.request(method=method, url=url,**kwargs) 文件

  • 问题内容: 我正在尝试在IntelliJ上运行我的android应用程序。我从现有来源创建了一个项目,并且正确连接了SDK,一切正常,直到在那里,但是当我尝试运行时,它会记录以下消息: 这在我创建的所有类中都会发生。 对可能发生的事情有任何想法吗?也许我必须在IDE中进行一些设置。 谢谢。 问题答案: 解决了!在intelliJ中,转到 “设置” >“编译器”>“ Java编译器”,然后在“ 使用

  • 问题内容: 我正在尝试将数据加载到我的MySQL数据库的表中,并得到此错误。 参考:此 路径是正确的百分率,我通过按shift键并单击“将路径复制为”将其复制并进行了多次检查。 因此,对此的任何提示将不胜感激 。 其次, 这里有没有办法使用某种相对路径(而不是绝对路径)? 问题答案: 我不知道您使用的是哪个版本的MySQL,但通过Google的快速搜索找到了您对这两个问题的可能答案。以下是《MyS