我正在学习maven构建过程,在争论的焦点上,这是一个非常突出的问题,因为它没有很大的意义。
根据我对maven的理解,有默认的生命周期(缺省生命周期、站点生命周期、清洁生命周期),每个生命周期都有多个阶段。有一些内置插件与几个阶段相关联,通过添加额外的插件,您可以添加额外的功能到预先存在的阶段。
当您指定要在maven中直接运行的阶段时,它将在同一生命周期内一直贯穿所有的阶段,最后执行指定的阶段。然而,据我所知,spring-boot:run是一个目标,因此在运行时不应该调用其他阶段。尽管如此,通过maven运行spring-boot:run确实会运行其他阶段(default-cli、pre-unit-test、default-resources、reserve-container-port等)。在我看来,spring已经创建了一些新的阶段(例如reserve-container-port),但我不知道如何找到这些阶段的配置所在的jar文件。
因此,我的问题有两个:
spring-boot:run是我所理解的目标吗?如果是这样的话,如何运行这个目标反过来运行其他阶段?据我所知,只有将阶段指定为目标,才能按顺序运行其他阶段,而不是直接指定目标。发布于 2019-08-25 18:57:25
是spring-boot:按我的理解运行一个目标
事实上,spring-boot是一个maven插件,run是它的目标之一。
这是这个插件的正式文件。
在本文档中,我没有找到执行此目标的默认maven阶段。但是在github源代码中,我发现这个目标是在TEST_COMPILE阶段执行的
只有将阶段指定为目标,才能按顺序运行前几个阶段,而不是直接指定目标。
事实上,maven就是这样工作的。这是一个maven生命周期简介
所有这些的配置文件在哪里?
它是在您的spring父程序中定义的:
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>${spring-boot-starter-parent.version}</version>
</parent>希望有此帮助:)
发布于 2019-08-26 02:09:05
由于另一个答案漏掉了一些我正在寻找的信息,我想我应该添加我的研究结果,以防其他人好奇。向内看
C:\HOME_DIR.m2\repository\org\springframework\boot\spring-boot-maven-plugin\VERSION_NUMBER\META-INF\maven\plugin.xml
用maven给出spring的大多数相关目标的配置文件。具体来说,下面的片段描述了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>具体来说,<executePhase>标记(在https://maven.apache.org/developers/mojo-api-specification.html中有部分详细说明),它(我相信)允许这个目标在运行时执行一个不同的阶段。
我之前忽略了这个细节(似乎在任何地方都没有很好的文档记录)。不管怎样,这个解释对我来说已经足够令人满意了。如果有人为这个标签找到了更好的文档,我希望有一个链接:)
发布于 2019-08-26 04:16:28
要从maven的角度直接回答您的问题:
所有关于生命周期,阶段和相关插件的东西--你得到的是正确的。
但是,您忽略了一点,在maven中,可以直接使用 run plugin的goal。将这些目标看作是执行某项任务的逻辑代码单元,一个具有"main“方法的类,如果您希望您能够运行,给它参数等等。
在maven的插件世界中,与目标相关的插件中的一段代码称为Mojo,maven可以执行这个类。
因此,一个插件至少包含一个模块,如果插件开发人员决定它应该做很多相关的事情,它可能会包含很多插件。下面是一个插件的示例,它有4个不同的目标(插件本身的代码中有Mojos )。
因此,这个直接调用的语法是:
mvn plugin-groupId:plugin-artifactId:plugin-version:goal
mvn plugin-groupId:plugin-artifactId:goal
mvn plugin-prefix:goal在某些条件下(请参阅官方maven文件),您可以省略其中的一些语法,这正是在您的情况下发生的情况。
当然,当您直接运行像这样的目标时,它完全绕过了包含阶段和一切的生命周期执行,因此,如果您想直接运行测试目标,但是您从未编译过测试,那么它就会失败。示例:
mvn test // run all phases of the default lifecycle including compilation, tests 
         // compilation, test execution - will succeed on a "clean" project
mvn surefire:test // run directly a goal called "test" inside plugin called "surefire"同样的事情发生在mvn spring-boot:run上。
您正在运行spring启动maven插件,maven将插件的版本解析为构建的版本,因为您没有指定它,然后运行一个名为"run“的目标
https://stackoverflow.com/questions/57647483
复制相似问题