如何配置多模块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 中运行应用程序