使用Maven多模块项目的Spring Boot

6
我有一个使用Maven多模块项目,其设计方式类似以下SO帖子中第一个答案:Multi-module maven with Spring Boot 现在我想要一个通用的Maven模块,可以包含一些模型,供多个微服务使用。如果我将这个通用项目作为一级父POM的子项目(这样所有由Boot注入的依赖项,如JPA、Jackson等都可以在通用项目中使用),则STS/Spring会检测到它是一个Boot应用程序,并在Maven构建时抱怨没有主类。
请问有人能建议我如何做到这一点?
当前代码: parent pom.xml:(仅包含相关部分)
    <project>
    <name>...</name>
    <groupId>...</groupId>
    <artifactId>...</artifactId>
    <packaging>pom</packaging>
    <version>...</version>
    <parent>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-parent</artifactId>
        <version>Brixton.M3</version>
        <relativePath />
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    </project>

child(通用模块)pom.xml(仅涉及相关部分),不是引导应用程序:

    <project>
    <artifactId>...</artifactId>
    <version>...</version>
    <name>...</name>

    <parent>
        <groupId>...</groupId>
        <artifactId>...</artifactId>
        <version>...</version>
    </parent>

    </project>
3个回答

11

我并不知道你的项目的所有细节,但我猜测spring-boot-maven-plugin在父级别定义(或者你在根目录下使用了spring-boot-starter-parent)。这会让构建将你的模块打包成一个Spring Boot应用程序(而这不是你想要的)。

STS可能会查找这个提示来确定模块是否包含Spring Boot应用程序。也许如果它查找带有@EnableAutoConfiguration(或SpringBootApplication)注释的主类会更好。

你可以通过指定重新打包目标的跳过属性来轻松解决这个问题(从构建方面来看)。

  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
          <skip>true</skip>
    </configuration>
  </plugin>

如果 STS 仍将此模块视为 Spring Boot 应用程序,则我会在他们的问题跟踪器中创建问题


2
感谢您的帮助。我按照您的建议尝试了,但没有起作用。我在子POM中添加了以下部分:<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> <configuration> <skip>true</skip> </configuration> </execution> </executions> </plugin> </plugins> </build> 然而,这降低了我的构建时间,因为常见模块不再被重新打包为可执行JAR文件。 - Shashank Singhal
恐怕没有更多的细节,我无法帮助你。 我现在只是猜测。 - Stephane Nicoll
非常感谢,这解决了我的一个问题,即spring-boot无法看到mainClass属性:D - argh

0

通常情况下,如果模块中没有Web容器,Spring Boot将不会启动Web容器。 我建议您使用命令分析您的依赖项

mvn dependency:tree 

还有一种确保的暴力方法是在您的application.properties中使用此配置

spring.main.web-environment=false

0

以下是两种解决方法:

  1. 你可以像@Stephane Nicoll提到的那样添加skip属性。但是,这将完全忽略该模块内部的测试用例。https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/it-skip.html
  2. 另一个选项是添加classifier属性,以使该模块成为单独的可执行jar文件。 https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/repackage-classifier.html

    <executions>
              <execution>
                <id>repackage</id>
                <goals>
                  <goal>repackage</goal>
                </goals>
                <configuration>
                  <classifier>exec</classifier>
                </configuration>
              </execution>
    

此修复将确保依赖模块获取其所需的jar文件,源模块仍将是可执行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接