【问题标题】:mvnw 和 mvnw.cmd 文件的用途是什么?
【发布时间】:2016-12-08 00:12:36
【问题描述】:

当我创建 Spring Boot 应用程序时,我可以在项目的根目录中看到 mvnwmvnw.cmd 文件。这两个文件的用途是什么?

【问题讨论】:

    标签: maven spring-boot


    【解决方案1】:

    简短回答:无需手动安装过程即可在终端中运行 Maven 和 Gradle。

    Gradle 示例:

    ./gradlew clean build
    ./gradlew bootRun
    

    Maven 示例:

    ./mvnw clean install
    ./mvnw spring-boot:run
    

    "推荐的执行任何 Gradle 构建的方法是借助 Gradle Wrapper(简称“Wrapper”)。Wrapper 是一个脚本,它调用已声明版本的Gradle,如有必要,请提前下载。因此,开发人员可以快速启动并运行 Gradle 项目,而无需遵循手动安装过程节省您公司的时间和金钱

    Gradle 还会添加一些与 Maven 文件 GradlewGradle.bat

    对应的特定文件

    【讨论】:

      【解决方案2】:

      Maven Wrapper 是需要特定 Maven 版本的项目(或根本不想安装 Maven 的用户)的绝佳选择。 无需在操作系统中安装多个版本,我们只需使用项目特定的包装脚本即可。

      mvnw:它是一个可执行的 Unix shell 脚本,用于代替完全安装的 Maven

      mvnw.cmd:适用于Windows环境


      用例

      包装器应该适用于不同的操作系统,例如:

      • Linux
      • OSX
      • 窗户
      • 索拉里斯

      之后,我们可以像这样在 Unix 系统上运行我们的目标:

      ./mvnw clean install
      

      以及以下批处理命令:

      ./mvnw.cmd clean install
      

      如果我们在包装器属性中没有指定的 Maven,它将被下载并安装在系统的文件夹 $USER_HOME/.m2/wrapper/dists 中。


      Maven Wrapper 插件

      Maven Wrapper plugin 在一个简单的 Spring Boot 项目中进行自动安装。

      首先,我们需要进入项目的主文件夹并运行以下命令:

      mvn -N io.takari:maven:wrapper
      

      我们也可以指定Maven的版本:

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

      选项-N表示--non-recursive,这样包装器只会应用于当前目录的主项目,而不是任何子模块。


      来源 1(进一步阅读): https://www.baeldung.com/maven-wrapper

      【讨论】:

      【解决方案3】:

      这些文件来自Maven wrapper。它的工作原理类似于Gradle wrapper

      这允许您运行 Maven 项目,而无需安装 Maven 并出现在路径上。如果找不到它,它会下载正确的 Maven 版本(据我所知,默认情况下在您的用户主目录中)。

      mvnw 文件用于 Linux (bash),mvnw.cmd 用于 Windows 环境。


      要创建或更新所有必要的 Maven Wrapper 文件,请执行以下命令:

      mvn -N io.takari:maven:wrapper
      

      要使用不同版本的 maven,您可以按如下方式指定版本:

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

      这两个命令都需要 maven on PATH(将 maven bin 的路径添加到系统变量上的 Path)如果您的项目中已经有 mvnw,您可以在命令中使用 ./mvnw 而不是 mvn .

      【讨论】:

      • 您的回答很有帮助。我检查了 Maven 包装器文档。我正在使用 mvn 命令进行 maven 操作,尽管我可以将 ./mvnw 用于相同目的。
      • 感谢您的回答。你能解释一下这个是什么时候生成的,就像你最初创建一个项目时一样吗?当您对 pom 进行更改(例如添加删除依赖项/插件)时,它会沿线更新吗?
      • 并且,您应该添加/提交 mvnw.cmd 文件吗?
      • 是的,当然。它允许您快速运行您的 maven 构建,而无需额外安装 maven 或将其放在 PATH 上。
      • 非常感谢您的回答,这非常有帮助 ¿您能告诉我们一些有关 Maven 设置文件的可移植性的信息吗? Saludos,再次感谢。
      【解决方案4】:

      目前最好的选择是使用 maven 容器作为构建工具。像这样的mvn.sh 脚本就足够了:

      #!/bin/bash
      docker run --rm -ti \
       -v $(pwd):/opt/app \
       -w /opt/app \
       -e TERM=xterm \
       -v $HOME/.m2:/root/.m2 \
       maven mvn "$@"
      

      【讨论】:

      • 这并没有回答 OP 问题,它只是提出了一个替代方案
      • maven wrapper 最基本的思想是为这个项目声明正确的maven版本。一个好处是避免了手动安装 maven 的需要。您的方法不仅没有解决版本问题,而且还需要一个本地安装的工具。
      • 另请注意,这会将用户自己的本地 Maven 存储库安装到 docker 实例中。通常它以 root 身份运行,因此 dockerized maven 实例编写的任何内容都归 Linux 下的 root 所有。这不一定是可取的。我发现 docker build 实例可访问的正确设置的 nexus 实例不那么痛苦,特别是如果您需要可重现的构建。
      • (继续)老式的 Jenkins 设置和心态导致了这种事情。现代 CI/CD 工具则相反:您只需选择一个构建容器。但这只是我的看法。
      • 我不会投反对票,因为作为替代方案,答案可能会有所帮助,但它完全忽略了 OP 问题的重点,你不能不解释就介绍 Docker 这样的复杂工具它是什么。
      【解决方案5】:

      命令mvnw 使用第一次使用时默认下载到~/.m2/wrapper 的Maven。

      每个项目中都指定了带有 Maven 的 URL .mvn/wrapper/maven-wrapper.properties:

      distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.9/apache-maven-3.3.9-bin.zip
      

      要更新或更改 Maven 版本,请调用以下命令(请记住关于多模块项目的 --non-recursive):

      ./mvnw io.takari:maven:wrapper -Dmaven=3.3.9 
      

      或者只是手动修改.mvn/wrapper/maven-wrapper.properties

      要使用 Maven 从头开始​​生成包装器(您需要已经在 PATH 运行:

      mvn io.takari:maven:wrapper -Dmaven=3.3.9 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-19
        • 1970-01-01
        • 2010-10-03
        相关资源
        最近更新 更多