【问题标题】:Spring boot with maven multi module projectSpring Boot 与 Maven 多模块项目
【发布时间】:2016-03-27 04:51:25
【问题描述】:

我有一个 Maven 多模块项目,其设计类似于以下 SO 帖子中的第一个答案: Multi-module maven with Spring Boot

现在我想要一个通用的 maven 模块,它可以包含一些供多个微服务使用的模型。如果我将这个公共项目作为第一级父 pom 的子项目(以便所有通过引导注入的依赖项,如 jpa、jackson 等都可用于公共),那么 STS/Spring 将其检测为引导应用程序并抱怨没有 Main Maven 构建类。

有人可以建议我如何实现这一目标吗?

当前代码:

父 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 (common module) pom.xml (只有相关部分),不是启动app:

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

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

    </project>

【问题讨论】:

    标签: spring-boot maven-module


    【解决方案1】:

    这里有两种解决方法:

    1. 您可以添加上述 @Stephane Nicoll 之类的跳过属性。但是,这将完全忽略该模块内的测试用例。 https://docs.spring.io/spring-boot/docs/current/maven-plugin/examples/it-skip.html
    2. 另一个选项是添加一个分类器属性,以便从此模块中生成一个单独的可执行 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,并且源模块仍然是可执行的。

    【讨论】:

      【解决方案2】:

      我没有关于您的项目的所有详细信息,但我最好的猜测是 spring-boot-maven-plugin 是在父级上定义的(或者您在根 pom 中使用 spring-boot-starter-parent)。这有效地要求构建将您的模块打包为 Spring Boot 应用程序(这不是您想要的)。

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

      您可以通过指定 skip property of the repackage goal 轻松解决问题(从构建端)

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

      如果 STS 仍将模块作为 Spring Boot 应用程序,我会创建 an issue in their tracker

      【讨论】:

      • 感谢您的帮助。我按照您的建议进行了尝试,但现在确实有所帮助。在子 pom 中添加了以下部分:&lt;build&gt; &lt;plugins&gt; &lt;plugin&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt; &lt;executions&gt; &lt;execution&gt; &lt;goals&gt; &lt;goal&gt;repackage&lt;/goal&gt; &lt;/goals&gt; &lt;configuration&gt; &lt;skip&gt;true&lt;/skip&gt; &lt;/configuration&gt; &lt;/execution&gt; &lt;/executions&gt; &lt;/plugin&gt; &lt;/plugins&gt; &lt;/build&gt; 但是这减少了我的构建时间,因为公共模块没有重新打包为可执行 jars
      • 恐怕,没有更多细节我帮不了你。我只是在这一点上猜测。
      • 非常感谢,解决了我的 spring-boot 看不到 mainClass 属性的问题:D
      【解决方案3】:

      通常,如果模块中不存在 Web 容器,Spring Boot 不会启动它。 我建议你使用命令分析你的 dendencies

      mvn dependency:tree 
      

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

      spring.main.web-environment=false
      

      【讨论】:

        猜你喜欢
        • 2015-10-10
        • 2014-06-02
        • 1970-01-01
        • 1970-01-01
        • 2016-09-13
        • 2017-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多