使用IntelliJ中的Gradle导入Protobuf生成的类

时间:2017-05-20 16:01:26

标签: java intellij-idea gradle protocol-buffers grpc

我无法使用Gradle导入Protobuf生成的类。

这就是我的项目树的样子:

Project tree:

我已经尝试将这些包标记为Source,我已经尝试了所有可能的导入组合:

import generated.main.grpc.GreeterGrpc;
import main.java.HelloRequest;
import java.*;
import HelloRequest;

它们都不起作用。这是我的build.gradle:

group 'andu'
version '1.0-SNAPSHOT'

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

sourceCompatibility = 1.5

repositories {
    mavenCentral()
    maven { url "https://plugins.gradle.org/m2/" }
}

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
    }
}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
    compile 'io.grpc:grpc-protobuf:1.0.0-pre2'
    compile 'com.google.protobuf:protobuf-java:3.0.0'
    compile 'io.grpc:grpc-stub:1.0.0-pre2'
    compile 'io.grpc:grpc-netty:1.3.0'
    compile 'io.grpc:grpc-protobuf:1.3.0'
    compile 'io.grpc:grpc-stub:1.3.0'
}



sourceSets {
    main {
        proto {
            srcDir 'src/main/proto'
        }
        java {
            srcDirs =  ['src/main/java', 'generated/main/java']
        }
    }
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.2.0"
    }
    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.3.0'
        }
    }

    generateProtoTasks.generatedFilesBaseDir = 'generated'

    generateProtoTasks {
        all()*.plugins {
            grpc {}
        }
    }
}

在我添加之前

generateProtoTasks.generatedFilesBaseDir = 'generated'

我生成的所有类都将添加到build / generated / main / java

4 个答案:

答案 0 :(得分:3)

自从我在Android项目中执行此操作后可能会有所不同,但对我有用的是在我的根build.gradle中添加classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.1"以及在build.gradle中添加以下内容。

另外,不要忘记运行gradle构建,因为除非您在编译器选项中选择了build project automatically option,否则只有运行才会自动生成类。

apply plugin: 'com.google.protobuf'

protobuf {
    generatedFilesBaseDir = "$projectDir/generated"
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0'
    }
    plugins {
        javalite {
            artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0"
        }
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.0.3'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java
            }
            task.plugins {
                grpc {}
            }
        }
    }
}

//Protobuf
compile 'com.google.protobuf:protobuf-lite:3.0.0'
compile 'com.google.protobuf:protobuf-java:3.0.0'

//GRPC
compile('io.grpc:grpc-protobuf:1.1.1') {
    exclude module: 'jsr305'
}
compile('io.grpc:grpc-okhttp:1.1.1') {
    exclude module: 'jsr305'
}
compile('io.grpc:grpc-stub:1.1.1') {
    exclude module: 'jsr305'
}

我还使用gRPC制作了两个基本但有效的例子,可以提供帮助。 Example Java project使用Maven(如果您愿意切换到Maven)。使用gradle的基本Example Android project虽然存在细微差别(我使用java-lite和okhttp而不是netty)。

答案 1 :(得分:1)

我在intellij中遇到了同样的问题,而在某些方面工作得很好,这只是在IDE中突出显示它的问题。我必须转到'项目结构' - >'模块' - >点击' root' - > ' Depencencies' - >' +'在底部签名 - >罐子或目录 - >将生成的dir添加为依赖项。

答案 2 :(得分:1)

来自:https://medium.com/@DivyaJaisawal/generate-java-code-from-proto-file-using-gradle-1fb9fe64e046

Protobuf插件假定Protobuf文件(* .proto)的组织方式与sourceSets中的Java源文件相同。 sourceSet的Protobuf文件在一次协议运行中进行编译,并将生成的文件添加到该sourceSet()的Java编译运行的输入中。

sourceSets {
    main {
        java {
            srcDirs 'build/generated/source/proto/main/grpc'
            srcDirs 'build/generated/source/proto/main/java'
        }
    }
}

答案 3 :(得分:-2)

如果要为java生成,则必须在proto文件中提及包名称,如下所示:

option java_package = "com.example";

这样做并再次生成。

现在导入如下:

`import com.example.HelloRequest;`