【问题标题】:Gradle: What is the proper way to specify the final spring-boot jar file?Gradle:指定最终 spring-boot jar 文件的正确方法是什么?
【发布时间】:2018-05-31 08:54:09
【问题描述】:

我的 spring-boot 应用程序最初是用 maven 构建的,但我正在尝试对其进行 gradle-ify。我的构建过程的一部分是使用 dockerfile-maven 插件制作 docker 镜像。最被接受的 gradle 等价物似乎是 com.palantir.docker,所以这就是我正在使用的(至少根据 this tutorial from pivotal。)

我的设置非常简单。我的 dockerfile 接受一个构建参数,即最终的 jar,并将其添加到图像中。

FROM openjdk:8-jdk-alpine
MAINTAINER github.com/paul-nelson-baker
EXPOSE 5005 8080 35729
ENTRYPOINT ["java", "-Xdebug", "-Xrunjdwp:server=y,transport=dt_socket,address=5005,suspend=n", "-jar", "/var/paulbaker/pauls-blog.jar"]
ARG JAR_FILE
ADD ${JAR_FILE} "/var/paulbaker/pauls-blog.jar"

让我挂断的部分是 gradle 设置。我传递的构建参数看起来是正确的:

docker {
    name = "paulbaker.io/my-blog"
    tags 'latest'
    dockerfile file('src/main/docker/Dockerfile')
    files "${project.name}-${version}.jar"
    buildArgs([JAR_FILE: "${project.name}-${version}.jar"])
}

但是,每当我尝试构建映像时,即使实际的 java 构建成功,我也会收到以下错误:

$ gradle build docker

> Task :docker FAILED
ADD failed: stat /var/lib/docker/tmp/docker-builder952857277/pauls-blog-0.0.1-SNAPSHOT.jar: no such file or directory

我尝试了无数种组合来尝试指定./build/libs/pauls-blog-0.0.1-SNAPSHOT.jar 的路径(相对于我的项目),我可以看到它存在,而上面的打印目录不存在。

显然我对 gradle 构建有一些不了解,有人可以弄清楚如何获取最终的 jar 文件吗?

【问题讨论】:

    标签: docker spring-boot gradle


    【解决方案1】:

    以下错误:

    > Task :docker FAILED
    ADD failed: stat /var/lib/docker/tmp/docker-builder952857277/pauls-blog-0.0.1-SNAPSHOT.jar: no such file or directory
    

    当 Palantir Docker 插件无法找到使用 docker.files 属性相对于您当前上下文目录指定的文件时发生。

    在您的问题中,插件正在项目的根目录(可能是您的 build.gradle 所在的位置)中搜索 jar 文件,但由于未在此处生成 jar 文件而失败。当您指定 jar.archivePath 时,您指定的是 jar 文件路径的完整位置,现在显然可以找到该文件。

    【讨论】:

      【解决方案2】:

      我已经解决了这个问题,但我不知道为什么会有所不同,所以我将问题保持开放,以便有人有机会详细解释为什么会这样。

      正确的值应该引用jar.archivePath。 所以最终的结果是这样的:

      docker {
          name = "paulbaker.io/my-blog"
          tags 'latest'
          dockerfile file('src/main/docker/Dockerfile')
          files jar.archivePath
          buildArgs([JAR_FILE: "${jar.archiveName}"])
      }
      

      【讨论】:

        【解决方案3】:

        files 的参数被添加到 docker 任务的 gradle CopySpec 中。

        所以files jar.archivePath 将创建 jar 构建工件的路径添加到此 CopySpec

        当您的 Dockerfile 被处理时,jar.archiveName 被插入到 ADD 模板中,因为您的 jar.archivePath 在 docker 构建上下文的 CopySpec 中,它会在CopySpec中找到jar.archiveName,并将文件复制到ADD的目的地。

        这是我在自己的测试中看到的结果。

        【讨论】:

          猜你喜欢
          • 2015-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-24
          • 2011-09-12
          • 1970-01-01
          • 1970-01-01
          • 2019-08-06
          相关资源
          最近更新 更多