如何配置多模块spring应用

Posted

技术标签:

【中文标题】如何配置多模块spring应用【英文标题】:How to configure multi module spring application 【发布时间】:2019-02-07 02:24:03 【问题描述】:

这是我的项目结构:

我有两个 spring-boot 模块。在 auth 模块中,我实现了 spring 安全性。我有 Auth 控制器,允许我们注册和登录(返回 jwt 令牌)。 在帐户管理模块中,我想获取用户配置文件,我应该使用 auth 模块。我应该有不同的数据库。

这是我的父母 pom:

 <groupId>com.social.network</groupId>
<artifactId>social-network</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
    <module>social-network-auth</module>
    <module>social-network-account-management</module>
</modules>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

这是 auth 模块的 pom:

    <groupId>com.social.network.auth</groupId>
    <artifactId>social-network-auth</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>social-network-auth</name>
    <description>Authentication module for SocialNetwork</description>

    <parent>
        <groupId>com.social.network</groupId>
        <artifactId>social-network</artifactId>
        <version>1.0-SNAPSHOT</version>
        <!--<relativePath>../pom.xml</relativePath>-->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <jwt.version>0.6.0</jwt.version>
        <swagger.version>2.7.0</swagger.version>
    </properties>

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

这是我的帐户管理的 pom

<groupId>com.social.network.account.management</groupId>
<artifactId>social-network-account-management</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>social-network-account-management</name>
<description>Account management module for SocialNetwork</description>

<parent>
    <groupId>com.social.network</groupId>
    <artifactId>social-network</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--<relativePath>../pom.xml</relativePath>-->
</parent>

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

<dependencies>
    <dependency>
        <groupId>com.social.network.auth</groupId>
        <artifactId>social-network-auth</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>


</dependencies>

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

我想运行我的所有模块。

但是构建失败。我在项目 egs-social-network 上执行目标 org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) 失败:部署失败:POM 中未指定存储库元素在 distributionManagement 元素或 -DaltDeploymentRepository=id::layout::url 参数中 -> [帮助 1]

【问题讨论】:

mvn deploy 正在将构建工件上传到 Maven 存储库。那是你真正想做的吗? 不,我想运行我的帐户和身份验证模块 【参考方案1】:

首先你应该明白两个不同的应用程序不能在同一个端口上运行。所以你的想法是正确的,但主要目标是将逻辑部分分成不同的模块,我的祝贺,你已经做到了。所以现在,只需建立正确的依赖链。 (子 -> 父!)而且子模块也不能是弹簧启动应用程序。它可能是您的主模块的某种附加类或库。请阅读答案How to make one module depend on another module artifact?。您可以在一个应用程序中拥有多个控制器,但使用不同的映射,您不需要为此目的使用两个不同的应用程序。 顺便说一句,首先请运行 mvn package 并安装 =)

【讨论】:

解决方案是创建一个api-gateaway模块并使用Netflix eureka 那是另一个故事,为此使用 api-gateway 并使用 eureka 很奇怪。【参考方案2】:

你必须打电话

mvn spring-boot:run 

在每个模块中运行应用程序。

您可以在“插件”下找到目标。

但是当您使用 IntelliJ 时,有一个 Spring Boot Run Dashboard,您可以在其中运行所有应用程序。

【讨论】:

我想在同一个端口上运行它们。 我在两个模块中都有控制器,它们应该可以从客户端获得。例如。 localhost:8080/api/v1/auth/signup, localhost:8080/api/v1/auth/signin 来自 auth 模块,localhost:8080/api/v1/account 来自 account-management 模块(这个应该提供从登录端点返回的令牌) 你的方法是错误的。您必须在 Spring Boot 应用程序上创建,然后将其他模块添加为依赖项。但这些模块不是 Spring Boot 应用程序。

以上是关于如何配置多模块spring应用的主要内容,如果未能解决你的问题,请参考以下文章

面试官:如何手写一个Spring Boot Starter?

spring boot关于多个模块(module)的配置问题

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

如何配置 Spring 以节省尽可能多的内存?

如何将maven多模块spring boot部署到docker容器

如何将 Spring Boot 项目集成到已经存在的多模块 Maven 项目中?