You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Maven/Gradle构建Java与Android共用的通用库?

跨Java服务端与Android的通用Entity库构建方案

问题背景

同时开发Java服务端与Android应用,需提取可复用的SQL数据库Entity代码,发布到本地仓库供两个项目共用,但遇到以下问题:

  • Maven尝试:使用android-maven-plugin导入androidx.room库发布到本地仓库,因未配置KSP导致Android项目报错:
    [ksp] [MissingType]: Element 'com.sage.feature.article.database.entity.ArticleItemEntity' references a type that is not present - com.sage.feature.article.database.entity.ArticleItemEntity
    
    且Maven不支持KSP。
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:22:04