Spring Boot 与 POM 打包聚合器

Posted

技术标签:

【中文标题】Spring Boot 与 POM 打包聚合器【英文标题】:Spring Boot with POM packaging Agregator 【发布时间】:2015-02-02 12:37:59 【问题描述】:

当项目的父POM因为它的孩子而使用打包模式POM时,是否可以使用Spring Boots Maven插件命令spring-boot:run


我有一个带有“主”POM 的多模块 maven 项目,它是 Spring Boot 父模块的子模块。看起来像这样:

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>project</artifactId>
    <packaging>pom</packaging>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.0.BUILD-SNAPSHOT</version>
        <relativePath/>
    </parent>

    <modules>
        <module>module1</module>
        <module>module2</module>
        <module>module3</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <start-class>com.example.module1.Application</start-class>
        <java.version>1.8</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

这基本上是我们的“主” POM,每个孩子都将其用作父母。现在我们要从这个“主”POM 所在的工作目录执行spring-boot:run 命令。问题是,这会生成一个奇怪的ClassNotFoundException,因为module1(这个Application 类所在的位置)包含在POM 并作为一个模块提及。

使用单个模块 maven 项目和 &lt;packaging&gt;jar&lt;/packaging&gt; 这将编译并运行 Application 类,因此不是 Spring-Boot 在这里无法正常工作。

在处理多模块 Maven 项目时,我必须进行哪些更改才能使其正常工作,还是根本无法使用 spring-boot-maven-plugin 插件?


旁注:我的应用程序类/模块 1 具有其他模块作为依赖项,因此在回答问题时请记住这一点。非常感谢任何有关如何改进这一点的建议。

【问题讨论】:

【参考方案1】:

据我所知,这是不可能的,因为插件需要一个可执行的 jar 才能运行。

spring-boot plugin 目标“运行”的文档说:

说明

运行一个可执行的归档应用程序

打包 pom 不会创建可执行文件。它只会生成一个 pom.xml。

尝试运行 mvn install 并查看部署到本地存储库的工件:

我刚刚为我的一个模块做了包装 pom:

[INFO] Installing C:\projects\boot-parent\pom.xml to 
C:\Users\...\repository\no\boot-parent\0.0.1-SNAPSHOT\boot-parent-0.0.1-SNAPSHOT.pom

如您所见,工件是 boot-parent-0.0.1-SNAPSHOT.pom。

尝试将插件配置放入具有 start-class(main-class)和包装 jar 的 module1 的 pom 中。

编辑您的评论:

您的评论表明您的客户端 Maven 安装存在问题。看看this answer。尤其是@ChristianAchilli 给出的答案。

我用来解决这个问题,方法是在我的本地 repo 中删除相应的下载失败的工件目录。下次我运行 maven 命令时,会再次触发工件下载。因此,我会说这是客户端设置。

再次,希望这会有所帮助!

托马斯

【讨论】:

我试着按照你的建议去做。将插件移动到 module1 pom 但这对我不起作用。这就是我得到的:[ERROR] Failed to execute goal on project application: Could not resolve dependencies for project com.example:module1:jar:0.1.0: Failure to find com.example:module2:jar:0.1.0 in http://repo.spray.io was cached in the local repository, resolution will not be reattempted until the update interval of spray-repo has elapsed or updates are forced -&gt; [Help 1]【参考方案2】:

多做一个模块,里面只有你的应用程序。 如果将依赖项插入到模块中,则可以使用 spring-boot:run 或 export as jar 正常启动模块。

仅将您的父母视为容器。

希望对你有用

【讨论】:

以上是关于Spring Boot 与 POM 打包聚合器的主要内容,如果未能解决你的问题,请参考以下文章

聚合maven+spring-boot打包可执行jar

没有父pom.xml的spring-boot无法生成war打包

spring boot多模块聚合工程

Spring Boot (四):打包部署

打包Spring Boot工程

pom文件配置打包外部/自定义jar文件在fat spring boot可执行jar文件中