Java SpringBoot:run如何与maven一起工作?
我正在学习maven的构建过程,有一个争论点很突出,那就是没有什么意义 按照我对maven的理解,有默认的生命周期(默认、站点、清理),每个生命周期都有多个阶段。有一些内置插件与几个阶段相关联,通过添加额外的插件,您可以向预先存在的阶段添加额外的功能 当您指定一个直接在maven中运行的阶段时,它将在同一生命周期中经历到目前为止的所有阶段,并以执行您指定的阶段结束。然而,就我所知,Java SpringBoot:run如何与maven一起工作?,java,spring,maven,spring-boot,Java,Spring,Maven,Spring Boot,我正在学习maven的构建过程,有一个争论点很突出,那就是没有什么意义 按照我对maven的理解,有默认的生命周期(默认、站点、清理),每个生命周期都有多个阶段。有一些内置插件与几个阶段相关联,通过添加额外的插件,您可以向预先存在的阶段添加额外的功能 当您指定一个直接在maven中运行的阶段时,它将在同一生命周期中经历到目前为止的所有阶段,并以执行您指定的阶段结束。然而,就我所知,springboot:run是一个目标,因此在运行时不应该调用其他阶段。也就是说,通过maven运行spring b
springboot:run
是一个目标,因此在运行时不应该调用其他阶段。也就是说,通过maven运行spring boot:run
会运行其他阶段(default cli
,pre-unit test
,default resources
,reserve container port
,以及其他一些阶段)。在我看来,spring已经创建了一些新的阶段(例如,reserve container port
),但我不确定如何找到这些阶段的配置所在的jar文件
因此,我的问题有两个:
springboot:run
是我理解的目标吗?如果是这样的话,这个目标又是如何运行其他阶段的?据我所知,只有指定一个阶段作为目标,才能按顺序运行之前的其他阶段,而不是直接指定目标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有一个基本的误解,这似乎是正确的答案。我想现在应该是这样的:我理解你在这里说的一切,但我的问题主要是,正如我在问题中指出的,为什么直接运行目标会运行其他阶段。我是西米