Java SpringBoot:run如何与maven一起工作?

Java SpringBoot:run如何与maven一起工作?,java,spring,maven,spring-boot,Java,Spring,Maven,Spring Boot,我正在学习maven的构建过程,有一个争论点很突出,那就是没有什么意义 按照我对maven的理解,有默认的生命周期(默认、站点、清理),每个生命周期都有多个阶段。有一些内置插件与几个阶段相关联,通过添加额外的插件,您可以向预先存在的阶段添加额外的功能 当您指定一个直接在maven中运行的阶段时,它将在同一生命周期中经历到目前为止的所有阶段,并以执行您指定的阶段结束。然而,就我所知,springboot:run是一个目标,因此在运行时不应该调用其他阶段。也就是说,通过maven运行spring b

我正在学习maven的构建过程,有一个争论点很突出,那就是没有什么意义

按照我对maven的理解,有默认的生命周期(默认、站点、清理),每个生命周期都有多个阶段。有一些内置插件与几个阶段相关联,通过添加额外的插件,您可以向预先存在的阶段添加额外的功能

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

因此,我的问题有两个:

  • springboot:run
    是我理解的目标吗?如果是这样的话,这个目标又是如何运行其他阶段的?据我所知,只有指定一个阶段作为目标,才能按顺序运行之前的其他阶段,而不是直接指定目标
  • 所有这些的配置文件位于哪里?我可以在哪个springjar文件中找到让上述所有功能正常工作的配置文件
  • SpringBoot:按照我的理解运行一个目标

    事实上,
    springboot
    是一个maven插件,
    run
    是它的目标之一

    下面是这个插件的一部分

    在本文档中,我没有找到执行此目标的默认maven阶段。但是在中,我发现这个目标是在
    TEST\u COMPILE
    阶段执行的

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

    事实上,这就是maven的工作原理。这是一个

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

    它在spring boot pom父级中定义:

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>${spring-boot-starter-parent.version}</version>
    </parent>
    
    
    org.springframework.boot
    spring启动程序父级
    ${spring boot starter parent.version}
    

    希望这有帮助:)

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

    C:\HOME\u DIR.m2\repository\org\springframework\boot\spring boot maven plugin\VERSION\u NUMBER\META-INF\maven\plugin.xml

    给出了SpringWithMaven的大多数相关目标的配置文件。具体来说,下面的代码片段描述了
    springboot: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>
    
    
    跑
    运行可执行的存档应用程序。
    测试
    假的
    真的
    假的
    ),这(我相信)让这个目标在运行时执行不同的阶段


    我以前错过了这个细节(似乎也没有很好地记录在案)。不管怎样,这个解释对我来说已经足够令人满意了。如果有人能找到关于这个标签的更好的文档,我希望有一个链接:)

    从maven的角度直接回答您的问题:

    所有关于生命周期、阶段和相关插件的东西——你都做对了

    然而,您错过了一点,在maven中可以直接运行插件的目标。 把这些目标看作是做某事的逻辑代码单元,如果您希望可以运行的话,可以使用方法“main”的类,为它提供参数等等

    在maven的插件世界中,插件中与目标相关的一段代码称为Mojo,maven可以执行这个类

    所以一个插件至少包含一个mojo,如果插件开发人员决定它应该做很多相关的事情,那么它可能会包含很多mojo。下面是一个插件的例子,到目前为止,它有4个不同的目标(插件本身代码中的Mojos)

    因此,此直接调用的语法是:

    mvn plugin-groupId:plugin-artifactId:plugin-version:goal
    mvn plugin-groupId:plugin-artifactId:goal
    mvn plugin-prefix:goal
    
    在某些情况下(请参阅),您可以省略某些语法,这正是您的案例中发生的情况

    当然,当您像这样直接运行目标时,它会完全绕过生命周期执行的各个阶段和所有内容,因此,如果您想直接运行测试目标,但从未编译过测试,那么它将失败。例如:

    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引导也会发生同样的情况:运行


    如果您运行的是spring boot maven插件,maven会将插件的版本解析为构建版本,因为您没有指定它,然后运行一个名为“run”的目标。

    我感谢您花时间回答,但您还没有真正触及为什么运行spring boot:run目标会导致运行其他阶段。你介意澄清一下它是如何工作的吗?在中,有一些答案,但我认为这(我鼓励你尝试一下;))给了我们我们想要的:运行一个特定的目标,而不执行它的整个阶段(以及之前的阶段),我们可以使用命令:mvn:我理解,但这不是我要问的。在我的问题中,我指出运行spring boot:run目标也运行其他阶段,似乎与您所说的直接矛盾。我正试图弄明白这是为什么。在了解了更多关于Maven的信息后,我为我之前的错误评论道歉。我对Maven有一个基本的误解,这似乎是正确的答案。我想现在应该是这样的:我理解你在这里说的一切,但我的问题主要是,正如我在问题中指出的,为什么直接运行目标会运行其他阶段。我是西米