如何通过Maven/Gradle构建Java与Android共用的通用库?
跨Java服务端与Android的通用Entity库构建方案
问题背景
同时开发Java服务端与Android应用,需提取可复用的SQL数据库Entity代码,发布到本地仓库供两个项目共用,但遇到以下问题:
- Maven尝试:使用
android-maven-plugin导入androidx.room库发布到本地仓库,因未配置KSP导致Android项目报错:
且Maven不支持KSP。[ksp] [MissingType]: Element 'com.sage.feature.article.database.entity.ArticleItemEntity' references a type that is not present - com.sage.feature.article.database.entity.ArticleItemEntity - Gradle尝试:使用Spring Boot相关插件后出现依赖解析错误,核心原因是
androidx.room:room-ktx的AAR格式无法在JVM服务端项目中解析。
一、Gradle方案(推荐)
1. 调整通用库插件配置
移除Spring Boot等专属插件,使用基础的Java/Kotlin库插件,避免依赖冲突:
plugins { `java-library` `kotlin-jvm` `maven-publish` // 用于发布到本地仓库 }
2. 优化Room依赖兼容性
Room的room-ktx是Android专属AAR,需拆分依赖:
- 通用Entity库仅依赖纯Java的
room-annotations,确保跨平台兼容:dependencies { implementation("androidx.room:room-annotations:2.5.0") implementation(kotlin("stdlib-jdk8")) } - Android项目单独引入
room-ktx、room-runtime并配置KSP生成代码;服务端项目可选择使用Room的JVM实现或其他ORM框架适配Entity注解。
3. 配置本地仓库发布
添加Maven发布配置,将库推送到本地Maven仓库:
publishing { publications { create<MavenPublication>("maven") { from(components["java"]) groupId = "com.sage" artifactId = "core-database-entity" version = "1.0.0" } } repositories { mavenLocal() } }
4. 客户端项目引入配置
- Android项目:
plugins { id("com.android.application") id("kotlin-android") id("com.google.devtools.ksp") } dependencies { implementation("com.sage:core-database-entity:1.0.0") implementation("androidx.room:room-ktx:2.5.0") implementation("androidx.room:room-runtime:2.5.0") ksp("androidx.room:room-compiler:2.5.0") } - Java服务端项目:
dependencies { implementation("com.sage:core-database-entity:1.0.0") // 可选:使用Room JVM实现 implementation("androidx.room:room-runtime:2.5.0") annotationProcessor("androidx.room:room-compiler:2.5.0") // 或使用Hibernate等ORM框架自行映射Entity注解 }
二、Maven方案(适配KSP限制)
1. 拆分Entity库与Room依赖
通用Entity库仅包含带注解的实体类,仅依赖room-annotations:
<dependencies> <dependency> <groupId>androidx.room</groupId> <artifactId>room-annotations</artifactId> <version>2.5.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib-jdk8</artifactId> <version>1.8.20</version> <scope>compile</scope> </dependency> </dependencies>
2. 发布到本地仓库
使用maven-install-plugin将库安装到本地Maven仓库:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>3.1.0</version> <executions> <execution> <id>install-library</id> <goals> <goal>install</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
3. Android项目单独配置KSP
在Android项目的Gradle中配置KSP和Room编译依赖,确保代码生成正常:
plugins { id("com.android.application") id("kotlin-android") id("com.google.devtools.ksp") } dependencies { implementation("com.sage:core-database-entity:1.0.0") implementation("androidx.room:room-ktx:2.5.0") implementation("androidx.room:room-runtime:2.5.0") ksp("androidx.room:room-compiler:2.5.0") }
内容的提问来源于stack exchange,提问作者SageJustus
相关产品推荐
相关产品推荐

