适用于Google Spanner与Dataflow的最优POM配置咨询
Java 17下GCP Spanner + Dataflow极简Maven配置(解决gRPC依赖冲突问题)
以下是基于最新兼容版本的优化POM配置,通过Google Cloud BOM和Apache Beam BOM彻底解决gRPC版本冲突导致的ClassNotFound、超时等问题,同时简化依赖管理:
<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> <groupId>com.example</groupId> <artifactId>spanner-table-copy</artifactId> <version>1.0-SNAPSHOT</version> <name>Spanner Table Copy</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <!-- 使用BOM统一管理版本,无需手动指定单个依赖版本 --> <google.cloud.bom.version>26.42.0</google.cloud.bom.version> <beam.bom.version>2.54.0</beam.bom.version> <lombok.version>1.18.36</lombok.version> <junit.jupiter.version>5.11.3</junit.jupiter.version> <mockito.version>5.14.2</mockito.version> <slf4j.version>2.0.13</slf4j.version> </properties> <!-- 引入BOM统一管理依赖版本 --> <dependencyManagement> <dependencies> <dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-bom</artifactId> <version>${google.cloud.bom.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.apache.beam</groupId> <artifactId>beam-sdks-java-bom</artifactId> <version>${beam.bom.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <!-- Google Cloud Spanner --> <dependency> <groupId>com.google.cloud</groupId> <artifactId>google-cloud-spanner</artifactId> <!-- 版本由BOM自动管理 --> </dependency> <!-- Apache Beam核心与GCP集成 --> <dependency> <groupId>org.apache.beam</groupId> <artifactId>beam-sdks-java-core</artifactId> </dependency> <dependency> <groupId>org.apache.beam</groupId> <artifactId>beam-sdks-java-io-google-cloud-platform</artifactId> </dependency> <dependency> <groupId>org.apache.beam</groupId> <artifactId>beam-runners-google-cloud-dataflow-java</artifactId> </dependency> <dependency> <groupId>org.apache.beam</groupId> <artifactId>beam-runners-direct-java</artifactId> </dependency> <!-- 日志依赖 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>${slf4j.version}</version> </dependency> <!-- 测试依赖 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>${mockito.version}</version> <scope>test</scope> </dependency> <!-- mockito-core和inline已包含在mockito-junit-jupiter中,无需重复引入 --> </dependencies> <build> <plugins> <!-- 适配Java17的编译器插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.12.1</version> <configuration> <source>${maven.compiler.source}</source> <target>${maven.compiler.target}</target> <!-- 如果不需要Java预览特性,可移除下面这行 --> <compilerArgs> <arg>--enable-preview</arg> </compilerArgs> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.3.2</version> <configuration> <!-- 移除不必要的参数,Mockito 5.x+对Java17已原生支持 --> </configuration> </plugin> <!-- 升级Shade插件适配Java17打包 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.5.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.SpannerTableCopyApp</mainClass> </transformer> <!-- 添加ServicesTransformer避免SPI服务类丢失 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
核心优化说明
- 引入Google Cloud BOM:自动管理所有GCP相关依赖(包括gRPC)的兼容版本,彻底解决手动指定版本导致的冲突,比如不同依赖拉取不一致的gRPC版本引发
ClassNotFound或超时问题。 - 引入Apache Beam BOM:统一Beam所有组件的版本,确保Beam与GCP服务的兼容性。
- 简化依赖配置:移除所有BOM已覆盖的依赖版本号,POM更简洁且版本一致性有保障。
- 适配Java17:升级编译器和Shade插件版本,移除不必要的兼容参数,确保在Java17环境下编译、打包正常。
- 精简测试依赖:Mockito的
mockito-junit-jupiter已包含mockito-core和mockito-inline,无需重复引入,减少冗余。
内容的提问来源于stack exchange,提问作者Woodsman
相关产品推荐
相关产品推荐

