Java 带有 Spring Boot 和多模块的 Maven 配置 - 在 Intellij 中运行应用程序

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/29257409/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 07:40:33  来源:igfitidea点击:

Maven configuration with Spring Boot & multi modules - run application in Intellij

javamavenintellij-ideamodulespring-boot

提问by klu00

I'm currently working on a REST API with Spring Boot.

我目前正在使用 Spring Boot 开发 REST API。

I'm new to Maven and have just started coding with IDEA (don't know well this IDE yet), and I have a problem...

我是 Maven 的新手,刚刚开始使用 IDEA 进行编码(还不太了解这个 IDE),我遇到了一个问题......

Here is my project structure :

这是我的项目结构:

  • parent
    • pom.xml
    • main module
      • controller
      • domain
      • App.java (Spring Boot main class)
      • pom.xml
    • sub module (need main module as dependency)
      • controllers
      • domain
      • pom.xml
  • 父母
    • pom.xml
    • 主模块
      • 控制器
      • 领域
      • App.java(Spring Boot 主类)
      • pom.xml
    • 子模块(需要主模块作为依赖)
      • 控制器
      • 领域
      • pom.xml

So when I run the project in Intellij, it starts, and I can access all URLs defined in the main module controller. But not the ones in the sub module controller... It looks like only the main module was loaded.

因此,当我在 Intellij 中运行该项目时,它会启动,并且我可以访问主模块控制器中定义的所有 URL。但不是子模块控制器中的那些......看起来只加载了主模块。

Here is my parent pom.xml :

这是我的父 pom.xml :

<project>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.1.RELEASE</version>
</parent>

<modelVersion>4.0.0</modelVersion>

<name>Test :: Test :: Parent POM</name>

<groupId>test.test.test</groupId>
<artifactId>project-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>

<properties>
    <!-- Specify Java Compiler Version -->
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>

    <!-- Spring -->
    <spring-boot.version>1.2.1.RELEASE</spring-boot.version>

    <!-- Sonar -->
    <sonar-maven-plugin.version>2.5</sonar-maven-plugin.version>
    <sonar.language>java</sonar.language>
    <sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
    <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
    <sonar.jacoco.reportPath>${project.basedir}/../target/jacoco.exec</sonar.jacoco.reportPath>

    <!-- Plugin -->
    <maven-surefire-plugin.version>2.18.1</maven-surefire-plugin.version>
    <jacoco-maven-plugin.version>0.7.3.201502191951</jacoco-maven-plugin.version>


    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

<modules>
    <module>submodule</module>
    <module>main</module>
</modules>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven-surefire-plugin.version}</version>
                <configuration>
                    <redirectTestOutputToFile>true</redirectTestOutputToFile>
                    <includes>
                        <include>**/*Test.java</include>
                        <include>**/*IT.java</include>
                        <include>**/*Story.java</include>
                    </includes>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>

    <plugins>
        <plugin>
            <groupId>org.jacoco</groupId>
            <artifactId>jacoco-maven-plugin</artifactId>
            <version>${jacoco-maven-plugin.version}</version>
            <configuration>
                <destFile>${project.basedir}/../target/jacoco.exec</destFile>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>prepare-agent</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>sonar-maven-plugin</artifactId>
            <version>${sonar-maven-plugin.version}</version>
        </plugin>

    </plugins>
</build>

</project>

Here my main module pom.xml :

这是我的主要模块 pom.xml :

<project>
<parent>
    <artifactId>project-parent</artifactId>
    <groupId>test.test.test</groupId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>main</artifactId>

<name>Test :: Test :: Main</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <commons-lang3.version>3.3.2</commons-lang3.version>
    <commons-codec.version>1.10</commons-codec.version>
    <jsr305.version>3.0.0</jsr305.version>

    <!-- Testing dependencies -->
    <http-commons.version>4.3.6</http-commons.version>
    <jbehave.version>3.9.5</jbehave.version>
    <assertj.version>1.7.1</assertj.version>
</properties>

<dependencies>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-rest</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    <dependency>
        <groupId>com.google.code.findbugs</groupId>
        <artifactId>jsr305</artifactId>
        <version>${jsr305.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>${commons-lang3.version}</version>
    </dependency>

    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>${commons-codec.version}</version>
    </dependency>

    <!-- Test dependencies -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
    </dependency>
    <dependency>
        <groupId>postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.1-901-1.jdbc4</version>
    </dependency>


    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>${http-commons.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>fluent-hc</artifactId>
        <version>${http-commons.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-commons</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jbehave</groupId>
        <artifactId>jbehave-spring</artifactId>
        <version>${jbehave.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>${assertj.version}</version>
    </dependency>

</dependencies>

<!-- Package as an executable jar -->
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

</project>

And here the sub module pom.xml :

这里是子模块 pom.xml :

<project>
<parent>
    <artifactId>project-parent</artifactId>
    <groupId>test.test.test</groupId>
    <version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>submodule</artifactId>

<name>Test :: Test :: Submodule</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

    <commons-lang3.version>3.3.2</commons-lang3.version>
    <commons-codec.version>1.10</commons-codec.version>
    <jsr305.version>3.0.0</jsr305.version>

    <!-- Testing dependencies -->
    <http-commons.version>4.3.6</http-commons.version>
    <jbehave.version>3.9.5</jbehave.version>
    <assertj.version>1.7.1</assertj.version>
</properties>

<dependencies>
    <dependency>
        <groupId>test.test.test</groupId>
        <artifactId>main</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</dependencies>
</project>

I think that's correct, but not sure... I run the project in Intellij with Maven with config :

我认为这是正确的,但不确定......我在 Intellij 中使用 Maven 和 config 运行项目:

  • working directory is root (not sub-module)
  • command line mvn spring-boot:run -Drun.arguments=--spring.profiles.active=dev -e -pl main
  • property start-class with parent.main.App
  • 工作目录是根目录(不是子模块)
  • 命令行 mvn spring-boot:run -Drun.arguments=--spring.profiles.active=dev -e -pl main
  • 带有 parent.main.App 的属性起始类

Need your help to configure all that stuff to run Spring Boot with all sub-modules loaded in the IDE for dev purpose... because I readlly don't know what is wrong in my config !

需要您的帮助来配置所有这些东西以运行 Spring Boot,并将所有子模块加载到 IDE 中以用于开发目的......因为我不知道我的配置有什么问题!

Thx !

谢谢 !

采纳答案by mhlz

You need to tell SpringBoot where to look for your controllers. Per default that only happens in sub-packages of your @SpringBootApplicationclass (which will probably not include your sub module).

您需要告诉 SpringBoot 在哪里寻找您的控制器。默认情况下,这只发生在您的@SpringBootApplication类的子包中(可能不包括您的子模块)。

In order to change that you can use @ComponentScan("path.to.package")to change the default package.

为了更改您可以使用@ComponentScan("path.to.package")更改默认包。

Additionally, you can use @EntityScanto do the same for @Entityclasses that might be in your sub-module.

此外,您可以@EntityScan@Entity可能在子模块中的类执行相同的操作。

回答by jiaobuchong

Your project structured as:

您的项目结构如下:

  • parent
    • pom.xml
    • main module
      • controller
      • domain
      • App.java (Spring Boot main class)
      • pom.xml (add sub moudle to main module as dependency)
    • sub module
      • controllers
      • domain
      • pom.xm
  • 父母
    • pom.xml
    • 主模块
      • 控制器
      • 领域
      • App.java(Spring Boot 主类)
      • pom.xml(将子模块作为依赖添加到主模块)
    • 子模块
      • 控制器
      • 领域
      • pom.xm

if your App.java in a package: com.xxxx.pro,then set the sub module's package is com.xxx.pro,such as your sub module's controller is TestController.java, and the code is:

如果你的 App.java 在一个包中:com.xxxx.pro,那么设置子模块的包是com.xxx.pro,比如你的子模块的控制器是 TestController.java ,代码是:

package com.xx.pro.web;
@RestController
public class TestController{

}

so, this sub moudle's TestController will be sanned by App.java.Try it on, good luck.

所以,这个子模块的 TestController 将被 App.java.Try it on sanned,祝你好运。

回答by Robocide

also note that in case of JPA Entities and repositories are not in sub packages of Application.java's package then @Entityscan and @EnableJpaRepositories MUST be declared in the Application class, e.g:

另请注意,如果 JPA 实体和存储库不在 Application.java 包的子包中,则必须在 Application 类中声明 @Entityscan 和 @EnableJpaRepositories,例如:

@Configuration
@ComponentScan(basePackages="com.my.pack")
@EnableAutoConfiguration
@EnableJpaRepositories(basePackages="com.my.pack")
@EntityScan(basePackages="com.my.pack")
public class Application{

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}