问题描述

部署Java应用到Azure Container App中,首先需要在本地构建镜像文件后上传到Azure Contaienr Registrier中。

但是,在第一步构建镜像的时候,就遇见错误:

=> ERROR [build 9/9] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package 0.6s
------
> [build 9/9] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package:
0.523 /bin/sh: line 1: ./mvnw.cmd: No such file or directory

就单独代码调试可以正常运行。而且,项目文件根目录(与Dockerfile同级)中,已经包含了 mvnw 文件和 mvnw.cmd, 所以,不应该是文件本身确实的原因导致的。

项目目录结构

....>javademo> tree /a /fFolder PATH listing for volume Local DiskVolume serial number is 4CDB-764AC:.|   .gitignore|   CHANGELOG.md|   CONTRIBUTING.md|   Dockerfile|   LICENSE.md|   mvnw|   mvnw.cmd|   pom.xml
...

DockerFile内容

# Build stage
FROM mcr.microsoft.com/openjdk/jdk:21-mariner AS build
ENV JAR_FILE=containerapps-albumapi-java-0.0.1-SNAPSHOT.jar
WORKDIR /app
COPY mvnw* /app/
COPY .mvn /app/.mvn
COPY pom.xml /app
COPY ./src /app/src
RUN ls -la /app
RUN chmod +x ./mvnw
RUN ./mvnw dependency:go-offline -B -Dproduction package # Runtime stage
FROM mcr.microsoft.com/openjdk/jdk:21-mariner
COPY --from=build /app/target/containerapps-albumapi-java-0.0.1-SNAPSHOT.jar /usr/src/myapp/
EXPOSE 8080
CMD ["/usr/bin/java", "-jar", "/usr/src/myapp/containerapps-albumapi-java-0.0.1-SNAPSHOT.jar"]

问题解答

以前遇见问题,全网搜索。当前,遇见问题,第一问AI大模型。

我得到的答案是:

我的问题:

RUN ./mvnw dependency:go-offline -B -Dproduction package 这句话在dockerfile中是什么目的呢?如果遇见报错“0.288 /bin/sh: line 1: ./mvnw: cannot execute: required file not found” 如何来解决它

 

M365 Copilot的回答:

这条命令:

RUN ./mvnw dependency:go-offline -B -Dproduction package

在 Dockerfile 中的作用是:

命令目的解释:

  1. ./mvnw:使用项目自带的 Maven Wrapper(mvnw),确保使用的是项目指定版本的 Maven,而不是系统安装的 Maven。
  2. dependency:go-offline:提前下载所有依赖项,以便后续构建过程可以在离线环境中进行,提高构建速度和稳定性。
  3. -B:表示 batch 模式,避免 Maven 交互式提示,适合自动化构建。
  4. -Dproduction:传递一个名为 production 的系统属性,可能用于激活某些 profile 或配置。
  5. package:执行 Maven 的 package 阶段,通常会编译代码并打包成 JAR 或 WAR 文件。

报错分析:

错误信息:

/bin/sh: line 1: ./mvnw: cannot execute: required file not found

说明 Docker 构建过程中找不到 ./mvnw 文件,可能原因如下:

解决方法:

  1. 确认 mvnw 文件是否存在于 Docker 构建上下文中

    • mvnwmvnw.cmd 应该在项目根目录。
    • 如果你用的是 .dockerignore 文件,确保没有把 mvnw 忽略掉。
  2. 检查 Dockerfile 的工作目录设置

    • 确保你在执行命令前设置了正确的工作目录,例如:

      WORKDIR /app
      COPY . /app
      RUN chmod +x mvnw
      RUN ./mvnw dependency:go-offline -B -Dproduction package
  3. 添加执行权限

    • 有时 mvnw 没有执行权限,可以加上:

      RUN chmod +x mvnw

如果你能提供 Dockerfile 的相关部分,我可以帮你更具体地定位问题并优化它。你想我帮你检查一下 Dockerfile 吗?

其实,根据以上三点提示,并没有定位到问题。

进一步思考, mvnw 是用于打包java 应用,而mvnw 和 mvnw.bat文件都是在创建项目是自动生成。

开始怀疑是文件内容由问题导致,所以决定删除并生成新文件。

使用下面的命令可以重新生成 mvnw文件或更新:

mvn -N io.takari:maven:wrapper

随后,再次执行 docker build 指令( docker build -t myalbum:v1 . )成功。镜像正常生成!

为了找到之前的 mvnw 文件为何会失败,在对比两个文件后发现:"重新生成mvnw文件是最快的解决之道"

参考资料

What is the purpose of mvnw and mvnw.cmd files? https://stackoverflow.com/questions/38723833/what-is-the-purpose-of-mvnw-and-mvnw-cmd-files

These files are from Maven wrapper. It works similarly to the Gradle wrapper.

This allows you to run the Maven project without having Maven installed and present on the path. It downloads the correct Maven version if it's not found (as far as I know by default in your user home directory).

The mvnw file is for Linux (bash) and the mvnw.cmd is for the Windows environment.


To create or update all necessary Maven Wrapper files execute the following command:

mvn -N io.takari:maven:wrapper

To use a different version of maven you can specify the version as follows:

mvn -N io.takari:maven:wrapper -Dmaven=3.3.3

Both commands require maven on PATH (add the path to maven bin to Path on System Variables) if you already have mvnw in your project you can use ./mvnw instead of mvn in the commands.

【Azure Container App】构建Java应用镜像时候遇无法编译错误:ERROR [build 10/10] RUN ./mvnw.cmd dependency:go-offline -B -Dproduction package的更多相关文章

  1. Azure Container App(一)应用介绍

    一,引言 容器技术正日益成为打包.部署应用程序的第一选择.Azure 提供了许多使用容器的选项.例如,我们可以使用 Azure 容器注册表来存储和管理 Docker Images.Azure Cont ...

  2. Azure DevOps(一)利用Azure DevOps Pipeline 构建应用程序镜像到AWS ECR

    一,引言 最近项目上让开始学习AWS,作为一名合格的开发人员,当然也是学会利用Azure DevOps Pipeline 将应用程序部署到 AWS ECS(完全托管的容器编排服务).我们要学会将应用程 ...

  3. Java,AWTUtilities,eclipse报编译错误:Access restriction: The type 'AWTUtilities' is not API (restriction on required library 'C:\Program Files\Java\jre7\lib\rt.jar')

    [场景]调用com.sun.awt.AWTUtilities时,eclipse提示编译错误: Access restriction: The type 'AWTUtilities' is not AP ...

  4. 【Azure 应用服务】Azure Function App 执行PowerShell指令[Get-Azsubscription -TenantId $tenantID -DefaultProfile $cxt]错误

    问题描述 使用PowerShell脚本执行获取Azure订阅列表的指令(Get-Azsubscription -TenantId $tenantID -DefaultProfile $cxt).在本地 ...

  5. Java程序员最常犯的错误盘点之Top 10

    1. 数组转ArrayList 为了实现把一个数组转换成一个ArrayList,很多Java程序员会使用如下的代码: Arrays.asList确实会返回一个ArrayList对象,但是该类是Arra ...

  6. Android Studio 编译错误 Error:Execution failed for task ':app:buildInfoDebugLoader'.

    今天来到打开昨天的项目运行正常,然后改动了一点代码编译报错: Error:Execution failed for task ':app:buildInfoDebugLoader'. > Exc ...

  7. Azure DevOps(二)利用Azure DevOps Pipeline 构建基础设施资源

    一,引言 上一篇文章记录了利用 Azure DevOps 跨云进行构建 Docker images,并且将构建好的 Docker Images 推送到 AWS 的 ECR 中.今天我们继续讲解 Azu ...

  8. Azure App Service(一)利用Azure DevOps Pipeline 构建镜像,部署应用程序

    一,引言 起因是前两天项目上做测试,需要我把写好的基于.NET 5 的 Web 测试程序作成 Docker 镜像.当我在本地验证完功能后,准备利用 Docker 构建应用程序镜像的时候,发现系统不支持 ...

  9. Jenkins教程(五)构建Java服务Docker镜像

    本文主旨 主要记录下如何使用Jenkins构建Java服务的Docker镜像,以及手动部署测试下 前期准备 已安装Jenkins 为jenkins用户添加到docker组内 本地装有maven,配置或 ...

  10. 使用 Azure Container Registry 储存镜像

    Azure Container Registry(容器注册表)是基于 Docker Registry 2.0规范的托管专用 Docker 注册表服务. 可以创建和维护 Azure 容器注册表来存储与管 ...

随机推荐

  1. 使用Python计算汉密尔顿路径

    引言 在图论中,汉密尔顿路径(Hamiltonian Path)是一个经典问题,它在很多实际应用中都有广泛的应用,如网络路由.旅行商问题等.今天,我们将一起探讨如何使用 Python 来计算汉密尔顿路 ...

  2. C#+Selenium+Nunit实现Web自动化demo

    1.新建Nunit工程 步骤如下: 打开Rider选择图示选项 使用Nuget安装对应库 2.编写代码 代码如下: using NUnit.Framework; using OpenQA.Seleni ...

  3. MySQL 中的索引数量是否越多越好?为什么?

    MySQL 中的索引数量是否越多越好?为什么? 虽然索引能够提高查询性能,但并不是索引越多越好.索引数量过多会带来一定的负面影响,尤其是在写操作频繁的场景下.需要根据实际的查询需求来合理设计索引,以平 ...

  4. 能用 Java8 开发 MCP(或 MCP Server),这才是 MCP 自由(Solon AI MCP)!

    现在,用 Java 开发 MCP 的情况是: 框架 JDK要求 mcp-sdk 需要 jdk17+ spring-ai-mcp-server 需要 jdk17 + spring-ai-mcp-clie ...

  5. python基础必练题!!

    水仙花数 水仙花数 info = 3 while info: # 用户输入数字 try: print(f"请输入数字,您有{info}次机会!!") num = int(input ...

  6. 工具 | WExploit

    0x00 简介 WExploit是一款基于java开发的漏洞检测工具. 下载地址 WExploit下载:WExploit下载 0x01 功能说明 Struts2 ThinkPHP 海康威视 泛微OA ...

  7. 代码随想录第十七天 | Leecode 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树

    Leecode 654. 最大二叉树 题目描述 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地在 ...

  8. 【记录】PDF|中英文PDF扫描版目录提取(一、QQ+GPT)

    需求: 1)从PDF里快速提取目录: 2)不想下载任何软件. 文章目录 一.用现有常用软件直接导出目录 1 (推荐指数☆)QQ OCR文字识别 2 (推荐指数0星)GPT4 图像识别 3 (推荐指数0 ...

  9. 信息资源管理综合题之“某国企投资IT应用人员减少但生成率没有实质性变化的IT黑洞问题”

    一.某大型国企在IT应用上投资了2000万美元,虽然蓝领工人数量大幅减少,但实际生产率并未有实质性变化 1.企业在IT应用上的巨额投资并未达到预期目标的这种现象被称为什么? 2.产生这现象的原因有哪些 ...

  10. 遇到的问题之“前端html中div设置边框border属性无效,解决方案”

    一.问题 二.解决方案 这里是漏了border-style属性,少了这个属性就不会显示边框了,加上就有边框了,这里是建议三个属性都要有完整 # 边距样式 border-style: inset;# 边 ...