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 不存在
在 Gradle 中,您不能拥有依赖于 Android 库的 Java 库。这是因为 Gradle 中的 Android 插件不是基于 Java 插件并且与它不兼容,所以 Java 不理解它的源集并且不能很好地使用它。
我不认为你可以纯粹通过 Gradle 配置来解决这个问题,即使你可以,它也可能会使你的构建变得非常复杂和脆弱。最好的办法是让您的 Java 内容仅依赖于 Java 内容,隔离常见的 protobuf 依赖项,并使 Android 端依赖于 Java。您概述了一些类的 Android 版本的方法;这可能会奏效,但我不知道你在做什么的足够详细信息来详细评论它。
| 归档时间: |
|
| 查看次数: |
2169 次 |
| 最近记录: |