构建依赖于Android项目Gradle的Java库

4
我有一个安卓项目,定义了各种数据类型,这些类型是通过 Protocol Buffers 进行序列化的。我想要一个单独的 Java 项目,在服务器端反序列化这些数据类型。
我的项目结构如下:
Android Library
  - Data
      - TypeA 
      - TypeB
      - ...

Java Server
  - Parser (depends on .Data)

在这个例子中,包Data中的所有类都处理自己的编组。尝试构建Java服务器时,它可以成功编译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 )  

虽然这确实可以解决我的问题,但似乎不是最好的解决方案。
有没有办法仅通过Gradle来完成这个任务?
参考以下是我缩写后的build.gradle文件。
Android Library:
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'
}

Java服务器:

apply plugin: 'java'


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

编辑:

具体而言,Gradle 给出了以下错误提示:

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


你提到了“但最终由于Gradle无法找到所引用的包而失败”。你能否提供更多关于这个错误的信息? - Mike Laren
有没有办法仅通过Gradle实现此目标?我怀疑。我不明白为什么Java服务器代码会依赖于“Data”。虽然我不是protobuf专家,但我认为它应该 依赖于“.proto”文件。仅仅因为你的服务器恰好是用Java编写的,并不意味着客户端和服务器之间应该有更紧密的耦合。毕竟,如果您的服务器是用任何其他编程语言实现的,您也不会让该服务器依赖于客户端使用的Java类。 - CommonsWare
@CommonsWare 嗯,我正在尝试发送从SensorEvent等实例接收到的一些数据。我有一个可以使用Protobuf序列化的数据类型,可以使用SensorEvent构造。 - danem
@MikeLaren 具体而言,错误为:error: package com.foo.bar.androidlib不存在。Android Studio可以轻松找到这些包,并且它可以首先编译它们,但在链接期间遇到麻烦。 - danem
我有一个可以使用Protobuf序列化的数据类型,可以使用SensorEvent构建。所以?Protobuf是接口定义。您的Android代码可以使用该接口定义和代码生成器创建可以由“SensorEvent”填充的类。您的服务器代码可以使用该接口定义和代码生成器创建可以执行服务器正在查找的任何操作的类。唯一共享的元素是“.proto”文件。 - CommonsWare
@CommonsWare 嗯,我已经将从 protobuf 消息创建 TypeA 的逻辑封装在 TypeA 本身中了。问题出现在当 TypeA 也可以使用类似 SensorEvent 等其他方式构建时。我不想每次更改都重新编写构建和读取 protobuf 消息的代码。我最终采取了我在问题中描述的路线,在 Android 端提供了方便的构造函数。 - danem
1个回答

8
在Gradle中,你不能有一个依赖于Android库的Java库。这是因为Gradle中的Android插件不基于Java插件,与其不兼容,因此Java无法理解其源集并且无法与其良好地协作。
我认为你不能仅通过Gradle配置来解决这个问题,即使你可以,它也可能会使你的构建变得非常复杂和脆弱。你最好让你的Java内容只依赖于Java内容,在那里隔离出共同的protobuf依赖项,并使Android端依赖于Java。你概述了一些类的Android版本的方法; 这可能有效,但我不知道你正在做什么的详细信息,无法进行详细评论。

如果同时声明apply plugin: 'com.android.library'apply plugin: 'java',它会将其识别为Java项目吗? - Mike Laren
不行,如果你尝试同时应用这两个插件,它会出问题的。 - Scott Barta
好的,谢谢你的建议,重构相对来说还算顺利,我已经暂时解决了这个问题。谢谢! - danem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接