构建依赖于 Android Project Gradle 的 Java 库

dan*_*nem 4 java android gradle android-studio

我有一个 Android 项目,它定义了通过协议缓冲区序列化的各种数据类型。我想要一个单独的 Java 项目,它能够在服务器上反序列化这些数据类型。

我的项目结构如下:

Android Library
  - Data
      - TypeA 
      - TypeB
      - ...

Java Server
  - Parser (depends on .Data)
Run Code Online (Sandbox Code Playgroud)

在此示例中,包 Data 中的所有类都自行处理编组。

在尝试构建 Java Server 时,它成功编译了 Android 项目,但最终失败,Gradle 说找不到引用的包。

请注意,如果我只引入其他 Java 库,我可以成功构建具有跨项目依赖关系的 Java 服务器,这让我相信这是一个 Java -> Android 依赖关系问题而不是 Gradle 配置问题。

我考虑过的可能解决方案是从 Android 项目中提取所有这些数据类型,并将它们放在一个单独的 Java 库中。然而,问题在于其中一些类仅提供了一种将 Android 特定类(SensorEvent、Location 等)转换为可与 ProtoBuf 一起使用的类型的方法。我一直在考虑的一种解决方案如下所示:

Data Types
  - TypeA
  - TypeB
  - ...

Android Library
  - Data
    - AndroidTypeA (Class with Android Specific constructor that can be cast to the parent type)
    - AndroidTypeB
    - ...

Java Server
  - Parser ( Depends on the Data Types module )  
Run Code Online (Sandbox Code Playgroud)

虽然这确实可以解决我的问题,但它似乎不是最好的解决方案。

有没有办法单独通过 Gradle 来实现这一点?


供参考,这里是我的build.gradle文件的缩写版本。

安卓库:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion "21.0.2"

    defaultConfig {
        applicationId "com.foo.bar.androidlib"
        ...
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    ...
    compile 'com.google.protobuf:protobuf-java:2.6.1'
}
Run Code Online (Sandbox Code Playgroud)

Java服务器:

apply plugin: 'java'


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.protobuf:protobuf-java:2.6.1'
    compile project(':androidlib')
}
Run Code Online (Sandbox Code Playgroud)

编辑:

具体来说,Gradle 给出了以下错误:

错误:包 com.foo.bar.androidlib 不存在

Sco*_*rta 5

在 Gradle 中,您不能拥有依赖于 Android 库的 Java 库。这是因为 Gradle 中的 Android 插件不是基于 Java 插件并且与它不兼容,所以 Java 不理解它的源集并且不能很好地使用它。

我不认为你可以纯粹通过 Gradle 配置来解决这个问题,即使你可以,它也可能会使你的构建变得非常复杂和脆弱。最好的办法是让您的 Java 内容仅依赖于 Java 内容,隔离常见的 protobuf 依赖项,并使 Android 端依赖于 Java。您概述了一些类的 Android 版本的方法;这可能会奏效,但我不知道你在做什么的足够详细信息来详细评论它。