我有一个Android项目,它定义了通过Protocol Buffers序列化的各种数据类型。我想有一个单独的Java项目,它能够在服务器上反序列化这些数据类型。
我的项目结构如下:
Android Library
- Data
- TypeA
- TypeB
- ...
Java Server
- Parser (depends on .Data)
在此示例中,数据包Data中的所有类都处理自己编组。
在尝试构建Java Server时,它成功编译了Android项目,但最终因Gradle无法找到引用的包而失败。
请注意,如果我只引入其他Java库,我可以成功构建具有跨项目依赖关系的Java Server,这让我相信这是一个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库:
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 Server:
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不存在
答案 0 :(得分:4)
在Gradle中,您不能拥有依赖于Android库的Java库。这是因为Gradle中的Android插件不是基于Java插件而且与它不兼容,因此Java不了解它的源集,否则无法使用它。
我认为你不能完全通过Gradle配置来解决这个问题,即使你可以,它也可能会使你的构建变得复杂而脆弱。最好的办法是让你的Java东西只依赖于Java的东西,隔离那里常见的protobuf依赖,让Android端依赖Java。您概述了使用某些类的Android版本的方法;这可能有用,但我不知道你正在做些什么来详细评论它。