如何使用 mvn -f 打包 pom.xml 在文件夹树中存在两个文件夹?

Posted

技术标签:

【中文标题】如何使用 mvn -f 打包 pom.xml 在文件夹树中存在两个文件夹?【英文标题】:How to package using mvn -f with the pom.xml being present two folders up in folder tree? 【发布时间】:2021-07-24 12:17:54 【问题描述】:

我正在 Windows 平台上编写一个脚本,我需要在其中打包 Maven 项目。现在的问题是我需要正确使用此命令,而pom.xml 位于上两层的文件夹中,即cd ..cd ..

此命令行无法按预期工作需要进行哪些修改?

mvn -f \.\.\ package -DskipTests 

当前目录是:

C:\Users\mike\Documents\mavenapp\fold1\fold2

我需要在两个文件夹中执行mvn,即在目录mavenapp中。

我不想这样做,因为这将是一个硬编码的解决方案:

mvn -f C:\Users\mike\Documents\mavenapp package -DskipTests

【问题讨论】:

我建议首先阅读有关Naming Files, Paths, and Namespaces 的Microsoft 文档,每个在Windows 上为Windows 程序或脚本编写代码的程序员都应该至少阅读一次。文件夹路径规范 \.\.\ 引用 当前驱动器root 目录(第一个反斜杠),在该目录下再次使用 .\ 并再次在该目录下使用一个更多.\这不是你想要的。 打开command prompt,运行call /? 并阅读解释如何引用批处理文件参数的输出帮助。参数 0 始终是批处理文件本身。因此,如果批处理文件存储在%UserProfile%\Documents\mavenapp\fold1\fold2 中,并且您想在命令行中使用上两级文件夹的路径,则最好使用mvn -f "%~dp0..\..\" package -DskipTest 来引用此文件夹。我建议不仅写mvn,而且至少写mvn 文件扩展名。 (.exe.com.cmd.bat,我不知道。) 请注意,%~dp0 引用的批处理文件路径始终以 Windows 目录分隔符 \ 结尾,因此%~dp0 与文件或文件夹名称或通配符模式的连接对于具有批处理文件路径的 100% 有效参数字符串,应始终不使用额外的反斜杠。 【参考方案1】:

你试过mvn ../../../pom.xml package吗?

【讨论】:

如果当前执行的目录与包含批处理文件和所有其他文件和文件夹的目录不同,这将不起作用。 Windows 资源管理器默认将cmd.exe 开始处理批处理文件的当前目录设置为批处理文件目录。但是使用Run as administrator 或批处理文件存储在网络资源上并使用UNC 路径访问网络资源时,当前目录可能会有所不同。当然,也可以在命令提示符窗口中使用任何目录中的完整限定文件名运行批处理文件。 换句话说,这段代码使用 Linux/Mac 目录分隔符 / 而不是 Windows 目录分隔符 \ 只是偶然而不是设计,因为它期望进程开始 cmd.exe 进行处理批处理文件将命令进程cmd.exe 的当前工作目录设置为批处理文件的目录。 Windows 机器上有数千个目录,它们可能是启动 cmd.exe 以处理批处理文件时的当前工作目录,但只有一个目录可以使用此代码。 通过加载奇怪的路径在命令行中没有正确的方法。正确的方法应该是在需要运行 mvn 的地方添加一个 pom 文件。但对于一个快速的解决方案,我认为使用 ../ 是一个不错的选择 我想让你知道的是 ../ 在 Windows 上并不正确,因为目录分隔符是 \,因此应该使用 ..\ 来引用文件 @987654333 @ 带有相对路径。是的,../ 也可以通过 Windows 文件管理自动替换(更正)所有 /(更正)\,如 Microsoft 在有关 Naming Files, Paths, and Namespaces 的文档中所述。但是在 Windows 上使用\ 作为目录分隔符而不是/ 会更好。 关于目录结构的问题不够详细,执行批处理文件时哪个目录是当前目录以及mvn 成功处理它们所需的所有文件在哪里。据我了解有问题的任务描述,我认为您的答案中使用了太多../(或更好的..\)。我还认为使用相对于批处理文件夹的路径引用文件 pom.xml 比使用相对于当前目录的路径引用文件 pom.xml 更好。但是,提问者接受了你的回答。

以上是关于如何使用 mvn -f 打包 pom.xml 在文件夹树中存在两个文件夹?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Maven 多模块项目中仅运行父 pom.xml

如何通过 pom.xml 运行的 mvn 包含多个 cucumber runner 类

在 mvn deploy 之前将变量值应用于 Pom.xml [关闭]

mvn打包源码的方法:maven-source-plugin

从npm 角度理解 mvn 的 pom.xml

jenkins指定pom打包