当前位置: 首页 > 知识库问答 >
问题:

如何使用Gradle构建Google协议缓冲区和Kotlin?

景翰音
2023-03-14

我正在尝试构建一个同时使用Google协议缓冲区和使用Gradle的Kotlin的项目。我希望将proto文件编译成Java源代码,然后从我的Kotlin代码中调用它。

我的源文件是这样排列的:

src/main/proto/*.proto
src/main/kotlin/*.kt
src/test/kotlin/*.kt

这是我的构建。gradle文件:

version '1.0-SNAPSHOT'

apply plugin: 'kotlin'
apply plugin: 'java'
apply plugin: 'com.google.protobuf'

repositories {
    mavenCentral()
    maven { url "http://dl.bintray.com/kotlin/kotlin-eap-1.1" }
}


buildscript {
    ext.kotlin_version = '1.1-M02'

    repositories {
        mavenCentral()
        maven { url "http://dl.bintray.com/kotlin/kotlin-eap-1.1" }
    }

    dependencies {
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0'
    }
}

dependencies {
    compile 'com.google.protobuf:protobuf-java:3.0.0'
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    testCompile 'junit:junit:4.12'
}

当我运行./gradlew汇编时,我在: compileKotlin期间收到一堆“未解决的引用”错误。之后,我可以看到没有生成Java源文件,因此似乎根本没有调用原始编译器。

如果我删除了apply插件:“kotlin”行,那么/gradlew assemble成功地生成了Java源代码,但当然我的Kotlin源代码从未编译过。

如何修复我的build.gradle,以便我可以从静态编程语言调用我的原型代码?

共有3个答案

佘缪文
2023-03-14

如果您在android和protobuf lite中使用多种构建类型和风格,请使用下面的kotlin。

例如,我有debugrelease构建,带有demoprod风格,它将创建demoDebugdemoReleaseprodDebug变体。

然后使用

`

android{
    sourceSets {
        debug.java.srcDirs += 'build/generated/source/proto/demoDebug/javalite'
        debug.java.srcDirs += 'build/generated/source/proto/prodDebug/javalite'
        release.java.srcDirs += 'build/generated/source/proto/demoRelease/javalite'
        release.java.srcDirs += 'build/generated/source/proto/prodRelease/javalite'
      }
    }

`

将不同的compileKotlin与generateProto绑定

tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all {
  if (getName() == 'compileDemoDebugKotlin')
    dependsOn(':app:generateDemoDebugProto')
  if (getName() == 'compileDemoReleaseKotlin')
    dependsOn(':app:generateDemoReleaseProto')
  if (getName() == 'compileProdDebugKotlin')
    dependsOn(':app:generateProdDebugProto')
  if (getName() == 'compileProdReleaseKotlin')
    dependsOn(':app:generateProdReleaseProto')
}
陈昂熙
2023-03-14

对于Kotlin和Android:

android {

    sourceSets {
        debug.java.srcDirs += 'build/generated/source/proto/debug/java'
        release.java.srcDirs += 'build/generated/source/proto/release/java'
    }
}

必须为每个构建类型添加一个额外的源代码目录。在此示例中有两种构建类型:debug发布

如果使用grpc,则必须为每个构建类型添加另一行:

android {

    sourceSets {
        debug.java.srcDirs += 'build/generated/source/proto/debug/java'
        debug.java.srcDirs += 'build/generated/source/proto/debug/grpc'
        release.java.srcDirs += 'build/generated/source/proto/release/java'
        release.java.srcDirs += 'build/generated/source/proto/release/grpc'
    }
}

至少对于静态编程语言1.0.6、Proprobuf-gradle-plugin 0.8.0、Proprobuf 3.2. x和grpc 1. x,它不需要摆弄任务顺序。

阳俊德
2023-03-14

我可以通过在构建中添加两行代码来实现这一点。格拉德尔。

第一行将proto编译器生成Java代码的目录添加到compileKotlin查找Java源代码的目录中:

sourceSets.main.java.srcDirs += 'build/generated/source/proto/main/java'

第二个确保在调用之前(重新)生成Java代码:compileKotlin

compileKotlin.dependsOn ':generateProto'
 类似资料:
  • 问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa

  • 我试图在Windows上的Qt中使用google协议缓冲区。因此,我使用MingGW的msys从github编译了protobuf源代码。proto编译器(protoc)似乎工作得很好,但遗憾的是,它无法使用生成的。博士和。pb。从Qt环境中抄送文件。 将此添加到我的。pro文件: 但我仍然得到“未定义的引用…”当我试图编译这个类时,它使用了所有的方法。 代码必须正确,因为它在使用protoc和Q

  • 请注意:虽然这个问题特别提到了Dropwizard,但我相信任何有泽西/JAX-RS经验的人都应该能够回答这个问题,因为我可以想象Dropwizard只是在幕后遵循泽西/JAX-RS约定。 我有一个Dropwizard服务,它用JSON编写,工作非常出色。 现在我想将其切换为读/写二进制数据(以最小化网络带宽)。我看到了Dropwizard Protobuf库,但我对在Dropwizard中实现二

  • 我在客户机-服务器体系结构中使用协议缓冲区作为有线数据格式。域对象(JavaBeans)将经历以下生命周期。 用于客户端业务逻辑 转换为协议格式 传送到服务器 转换回域对象 用于服务器端业务逻辑 “协议缓冲器和O-O设计”部分在协议留档中建议在适当的域模型内包装生成的类。 我想找出最好的办法。 例如,我有一个简单的原型定义。 这就是域模型的定义方式。如您所见,数据完全存储在proto builde

  • 据我所知,协议缓冲区主要用于控制服务器和客户端代码的项目。我的一般问题是——协议缓冲区能否用于将二进制消息序列化/反序列化到使用现有协议的服务器?所以,我的问题: > 如果协议缓冲区不支持本机微调现有协议的序列化/反序列化方式,那么可以通过扩展添加该功能吗?是否可以以某种方式添加序列化/反序列化方法可以识别的关键字?也许这可以通过扩展或修改protobuf csharp port或protobuf

  • 两者都是序列化库,由谷歌开发人员开发。他们之间有什么大的区别吗?将使用协议缓冲区的代码转换为使用FlatBuffers需要大量工作吗?