【问题标题】:Way to run Maven from Python script?从 Python 脚本运行 Maven 的方法?
【发布时间】:2026-01-14 13:10:01
【问题描述】:

(我使用的是 Windows。)

我正在尝试从 python 脚本运行 maven。我有这个:

import subprocess

mvn="C:\\_home\\apache-maven-2.2.1\\bin\\mvn.bat --version"
p = subprocess.Popen(mvn, shell=True, stdout = subprocess.PIPE)

stdout, stderr = p.communicate()
print p.returncode # is 0 if success

它工作正常,但我想知道以下几点:

  • 添加参数而不是附加字符串的更好方法。
  • 也许一些特定的方式来运行 maven 没有上述内容。
  • 一种显示输出的方式(目前它仅根据失败/成功打印 1 或 0)。

我想要长期完成的工作(我注意到这一点以防有人有更好的方法)是制作一个简单的脚本来构建项目列表并将另一个文件列表(jar/其他修改过的东西)移动到要部署到虚拟机的文件夹,手动执行非常痛苦。我在批处理脚本中工作不费吹灰之力,我只是好奇地学习 Python 并想知道它是否更容易管理,因为我可以制作几个列表并遍历每个位置而不是一行批处理脚本中的每个任务。

(我的批处理脚本的简短版本。)

@set version=7.8.3
@set staging_folder=C:\Users\me\Desktop\staging

@set stage_was=%staging_folder%\was
@set stage_ear=%stage_was%\stuffui.ear
@set stage_war=%stage_ear%\stuff-%version%.war

:: delete stage contents
call del /s /q %staging_folder%
call rmdir /s /q %stage_was%

:: make folders
call mkdir %stage_ear%
call mkdir %stage_war%\WEB-INF\lib

:: maven builds
call mvn -f C:\workspace\pom.xml -pl proj1,proj2 clean install

:: copy to stage
call xcopy C:\workspace\proj1\target\thing1.jar %stage_ear%\ /i /y

call xcopy C:\workspace\proj2\target\thing2.jar %stage_ear%\ /i /y
call xcopy C:\workspace\proj2\target\thing2.jar %stage_war%\WEB-INF\lib\ /i /y

【问题讨论】:

  • 试试这样call mvn -f C:\workspace\pom.xml -pl "proj1,proj2" clean install
  • 我的批处理脚本按原样工作,我正在尝试在 Python 中制作类似的东西。
  • 我认为告诉maven以批处理模式运行很重要(因此它使用默认值并且不提示输入):mvn --batch-mode -v
  • @wemu 最好是-V 而不是-v。参见Maven:完整参考,6.1.4。显示版本信息: "the -v option will terminate the Maven process after printing out the version.""_
  • 真的。只是想强调批处理模式-并弄乱了-v(与-V不同)-非常正确:)

标签: python maven batch-file


【解决方案1】:

Apache Maven Invoker API

Mark's answer to Accessing Java API information with Python 提及:

Jython 是在 Java VM 上运行的 Python。

请参阅my answers there 获取有关如何使用 Maven 调用程序的示例(在本例中来自 Java 中)。

【讨论】:

  • 我想澄清一下,这个 Apache Maven Invoker API 是 java,所以你建议我使用 Jython 通过 JVM 来利用它,同时在技术上使用/学习 Python,对吧?
【解决方案2】:

回复:

万一有人有更好的方法

回复:

将另一个文件列表(jars/其他修改过的东西)移动到一个文件夹中

您是否考虑过使用 Maven 本身(在这种特殊情况下,它的 Resources Plugincopy-resources 目标)?

回复:

我只是想学 Python

既然您一直在使用 Java:您是否考虑将 Groovy 作为您选择的脚本语言?

它的一些优点:

  • Java 语言是 Groovy 语言的子集。 IE。每个 Java 代码也是 Groovy 代码。在学习时,您不必从一开始就使用成熟的 Groovy 语法。
  • 可以编写脚本。
  • Jenkins 等工具中支持脚本和DSL

【讨论】:

  • 感谢您的建议,我将传递复制资源,因为如果我没有 pom 文件,我不想愚弄,就 Groovy 与 Python 而言,它只会提高同样的问题:“我如何通过 Groovy 调用 maven”
  • @CaptainMan “我如何通过 Groovy 调用 maven” – 通过我在此处的其他答案中提到的 Maven Invoker API。