spring-boot:run 如何与 Maven 一起工作?

6 java spring maven spring-boot

我正在学习 Maven 构建过程,并且有一个争论点突出,因为没有多大意义。

我理解 Maven 的方式是,有默认的生命周期(default、site、clean),每个生命周期都有多个阶段。有一些与几个阶段相关的内置插件,通过添加其他插件,您可以向预先存在的阶段添加额外的功能。

当您指定直接在 Maven 中运行的阶段时,它将在同一生命周期内经历到目前为止的所有阶段,并以执行您指定的阶段结束。然而,据我所知,spring-boot:run这是一个目标,因此在运行时不应调用其他阶段。话虽这么说,spring-boot:run通过 maven 运行确实会运行其他阶段(default-clipre-unit-testdefault-resourcesreserve-container-port和其他一些阶段)。在我看来,spring 创建了一些新的阶段(reserve-container-port例如),但我不确定如何找到这些配置所在的 jar 文件。

因此我的问题是双重的:

  1. spring-boot:run我理解的目标吗?如果是这样,运行这个目标又如何运行其他阶段?据我所知,只有指定一个阶段作为目标才会按顺序运行前面的其他阶段,而不是直接指定目标。
  2. 所有这些的配置文件位于哪里?在哪个 spring jar 文件中我可以找到让上述所有内容正常工作的配置文件。

Ahm*_*ETI 6

spring-boot:run 是我理解的目标吗

事实上,spring-boot是一个maven插件,run也是它的目标之一。

这是这个插件的官方文档

在该文档中,我没有找到执行此目标的默认 Maven 阶段。但从 GitHub源代码中,我发现这个目标是阶段性执行的TEST_COMPILE

仅指定一个阶段作为目标将按顺序运行前面的其他阶段,而不是直接指定目标。

事实上,maven就是这样工作的。这里介绍一下maven生命周期

所有这些的配置文件位于哪里?

它在你的 spring-boot pom 父级中定义:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>${spring-boot-starter-parent.version}</version>
</parent>
Run Code Online (Sandbox Code Playgroud)


小智 5

由于另一个答案遗漏了我正在寻找的一些信息,我想我应该添加我的研究结果,以防其他人好奇。寻找

C:\HOME_DIR.m2\repository\org\springframework\boot\spring-boot-maven-plugin\VERSION_NUMBER\META-INF\maven\plugin.xml

给出了 spring 与 maven 的大多数相关目标的配置文件。具体来说,下面的代码片段描述了spring-boot:run目标如何运作。

<mojo>
      <goal>run</goal>
      <description>Run an executable archive application.</description>
      <requiresDependencyResolution>test</requiresDependencyResolution>
      <requiresDirectInvocation>false</requiresDirectInvocation>
      <requiresProject>true</requiresProject>
      <requiresReports>false</requiresReports>
      <aggregator>false</aggregator>
      <requiresOnline>false</requiresOnline>
      <inheritedByDefault>true</inheritedByDefault>
      <phase>validate</phase>
      <executePhase>test-compile</executePhase>
      <implementation>org.springframework.boot.maven.RunMojo</implementation>
      <language>java</language>
      <instantiationStrategy>per-lookup</instantiationStrategy>
      <executionStrategy>once-per-session</executionStrategy>
      <since>1.0.0</since>
      <threadSafe>false</threadSafe>
      ...
</mojo>
Run Code Online (Sandbox Code Playgroud)

具体来说,<executePhase>标签(部分详细信息请参见https://maven.apache.org/developers/mojo-api-specification.html),(我相信)它让这个目标在运行时执行不同的阶段。

我之前错过了这个细节(它似乎也没有在任何地方得到很好的记录)。不管怎样,这个解释对我来说已经足够令人满意了。如果有人找到此标签的更好文档,我将不胜感激一个链接:)