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

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
云原生网关 MSE Higress,422元/月
可观测监控 Prometheus 版,每月50GB免费额度
简介: 在部署Java应用到Azure Container App时,构建镜像过程中出现错误:“./mvnw.cmd: No such file or directory”。尽管项目根目录包含mvnw和mvnw.cmd文件,但依然报错。问题出现在Dockerfile构建阶段执行`./mvnw dependency:go-offline`命令时,系统提示找不到可执行文件。经过排查,确认是mvnw文件内容异常所致。最终通过重新生成mvnw文件解决该问题,镜像成功构建。

问题描述

部署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 /f

Folder PATH listing for volume Local Disk

Volume serial number is 4CDB-764A

C:.

| .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 忽略掉。
  1. 检查 Dockerfile 的工作目录设置
  • 确保你在执行命令前设置了正确的工作目录,例如:
WORKDIR /app
COPY . /app
RUN chmod +x mvnw
RUN ./mvnw dependency:go-offline -B -Dproduction package
  1. 添加执行权限
  • 有时 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.

 



当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

相关文章
|
2月前
|
Java 应用服务中间件 API
【App Service】部署War包到Azure云上遇404错误
Java应用部署至Azure App Service for Windows后报404,本地运行正常。经排查,日志提示类文件版本不兼容:应用由Java 17(class file version 61.0)编译,但环境仅支持到Java 11(55.0)。错误根源为Java版本不匹配。调整App Service的Java版本至17后问题解决,成功访问接口。
153 1
|
2月前
|
存储 Linux 网络安全
【Azure App Service】Root CA on App Service
Azure App Service for Windows应用连接外部SSL服务时,需确保其证书由受信任的根CA颁发。多租户环境下无法修改根证书,但ASE(单租户)可加载自定义CA证书。若遇证书信任问题,可更换为公共CA证书或将应用部署于ASE并导入私有CA证书。通过Kudu的PowerShell(Windows)或SSH(Linux)可查看当前受信任的根证书列表。
104 13
|
3月前
|
数据安全/隐私保护
【Azure Function App】PowerShell Function 执行 Get-AzAccessToken 的返回值类型问题:System.String 与 System.Security.SecureString
将PowerShell Function部署到Azure Function App后,Get-AzAccessToken返回值类型在不同环境中有差异。正常为SecureString类型,但部分情况下为System.String类型,导致后续处理出错。解决方法是在profile.ps1中设置环境变量$env:AZUREPS_OUTPUT_PLAINTEXT_AZACCESSTOKEN=false,以禁用明文输出。
112 1
|
3月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
302 86
|
3月前
|
API 网络架构 容器
【Azure Container App】查看当前 Container App Environment 中的 CPU 使用情况的API
在扩展 Azure Container Apps 副本时,因 Container App Environment 的 CPU 核心数已达上限(500 cores),导致扩展失败。本文介绍如何使用 `az rest` 命令调用 Azure China Cloud 管理 API,查询当前环境的 CPU 使用情况,并提供具体操作步骤及示例。
147 16
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
187 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
211 1
|
3月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
162 0
|
3月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
261 16