如何让Vaadin与REST API两个Spring应用在不同端口独立运行?
问题描述
背景信息
我使用Maven进行项目构建,现有两个SpringBoot项目:
- 集成SpringBoot Security的SpringBoot Vaadin 24项目,包含数据库访问等核心逻辑;
- 基于Spring Web的SpringBoot REST API项目,仅负责路由定义与接口暴露。
两者需要互相访问部分类,且要求在不同端口运行(例如:Vaadin@8443、API@8081)。
已尝试方案
- 初始尝试使用单个
.pom文件,通过自定义@PropertySource配置两个应用,结果启动了两个Vaadin应用; - 创建3个
.pom文件实现多模块结构,基础配置正常,但将一个应用作为依赖引入另一个时,仍出现两个Vaadin应用的问题; - 尝试在独立线程中运行应用,依旧出现两个Vaadin应用;
- 尝试移除SpringBoot改用纯Spring,但Vaadin 14版本后与纯Spring兼容问题严重。
问题分析
我认为当相互引入依赖时,Vaadin应用的依赖会覆盖REST API的依赖,导致所有应用都被识别为Vaadin应用。
无相互依赖时的POM文件
Vaadin应用POM文件
<?xml version="1.0" encoding="UTF-8"?> <!-- ~ Copyright (c) 2023. Maxim Gabriel Nicolai Palotti ~ All rights reserved. --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- Project from https://start.vaadin.com/project/4e52dedc-ceb8-4221-a2a7-59d966e78c3a --> <groupId>org.company.xxx</groupId> <artifactId>xxx</artifactId> <name>xxx</name> <version>1.0.0</version> <packaging>jar</packaging> <properties> <java.version>17</java.version> <vaadin.version>24.1.4</vaadin.version> <selenium.version>4.10.0</selenium.version> </properties> <repositories> <repository> <id>Vaadin Directory</id> <url>https://maven.vaadin.com/vaadin-addons</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> <dependencyManagement> <dependencies> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-bom</artifactId> <version>${vaadin.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.vaadin</groupId> <!-- Replace artifactId with vaadin-core to use only free components --> <artifactId>vaadin-core</artifactId> </dependency> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.parttio</groupId> <artifactId>line-awesome</artifactId> <version>1.1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-testbench-junit5</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <defaultGoal>spring-boot:run</defaultGoal> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <jvmArguments>-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5151</jvmArguments> <wait>500</wait> <maxAttempts>240</maxAttempts> </configuration> </plugin> <plugin> <groupId>com.vaadin</groupId> <artifactId>vaadin-maven-plugin</artifactId> <version>${vaadin.version}</version> <executions> <execution> <goals> <goal>prepare-frontend</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <profiles> <profile> <!-- Production mode is activated using -Pproduction --> <id>production</id> <dependencies> <!-- Exclude development dependencies from production --> <dependency> <groupId>com.vaadin</groupId> <artifactId>vaadin-core</artifactId> <exclusions> <exclusion> <groupId>com.vaadin</groupId> <artifactId>vaadin-dev</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>com.vaadin</groupId> <artifactId>vaadin-maven-plugin</artifactId> <version>${vaadin.version}</version> <executions> <execution> <goals> <goal>build-frontend</goal> </goals> <phase>compile</phase> </execution> </executions> </plugin> </plugins> </build> </profile> <profile> <id>it</id> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <id>start-spring-boot</id> <phase>pre-integration-test</phase> <goals> <goal>start</goal> </goals> </execution> <execution> <id>stop-spring-boot</id> <phase>post-integration-test</phase> <goals> <goal>stop</goal> </goals> </execution> </executions> </plugin> <!-- Runs the integration tests (*IT) after the server is started --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> <configuration> <trimStackTrace>false</trimStackTrace> <enableAssertions>true</enableAssertions> </configuration> </plugin> </plugins> </build> </profile> </profiles> </project>
REST API应用POM文件
<?xml version="1.0" encoding="UTF-8"?> <!-- ~ Copyright (c) 2023. Maxim Gabriel Nicolai Palotti ~ All rights reserved. --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.2</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.company.yyy</groupId> <artifactId>yyy</artifactId> <version>0.0.1-SNAPSHOT</version> <name>yyy</name> <description>A standard API</description> <properties> <java.version>17</java.version> </properties> <dependencies> <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>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
内容的提问来源于stack exchange,提问作者chillin.killer
相关产品推荐
相关产品推荐

