通过引用其他存储库或项目或jar文件中的其他protobuf消息来分层编写协议缓冲区(protobuf)定义

时间:2016-05-06 20:47:55

标签: java maven jar protocol-buffers

大局是我有一个protobuf(想象它就像一个类)数据类型,它引用另一个protobuf,它位于另一个Jar文件中,它是我的POM文件中的依赖项。这非常适用于.java文件,但遗憾的是,它不适用于protobuf文件。我能想到的最好的解决方案是告诉Maven在一个位置提取另一个依赖Jar(包含proto文件)文件,然后告诉Maven对该位置的所有这些proto文件进行protoc编译。唉,我不知道如何告诉Maven这样做。由于我们使用标准Jar文件来捕获我们的proto文件,因此将非常感谢任何帮助。

import "X.proto"; // refers to a proto file in another jar

import "Y.proto";

message A {

  repeated X o = 1; // This cant be done
  repeated Y e = 2;

}

由于X与此文件不在同一路径,因此上述操作无效。

1 个答案:

答案 0 :(得分:2)

我在Gradle中找到了解决方案。填写下面的空白并正确指出你的回购,你应该能够得到以下工作。现在,您可以通过其他jar文件中的proto文件在多个项目中按层次结构组合protobufs!

在gradle中,您可以使用以下内容:

// these are your protobuf plugin repositories
buildscript {  
   repositories {
       maven {
           url 'WHERE YOUR PROTOBUF PLUGIN EXISTS. e.g. http://maven or MavenCentral()'
       } 
   }

   dependencies {
       classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.0'    
       classpath 'com.google.protobuf:protoc:2.6.1'
   }
}

apply plugin: 'com.google.protobuf'

group = "YOUR PACKAGE NAME. e.g. com.x.y"
version = "1.0" // release version

// these are your regular dependencies repositories. This could be
// very similar to the ones in buildscript above. 
repositories {  
    mavenLocal()
}

// this is needed by the plugin and is where teh magic happens. It 
// tells protobuf where to extract all the proto files that it finds 
// in all  the dependency jar files you have          
protobuf { 
    generatedFilesBaseDir="$projectDir/src/"    
}
// also magic you need for this protobuf plugin to work    
sourceSets {
     main {
        // this tells the plugin where your project specific
        // protofiles are located   
        proto {    
           srcDir 'src/main/resources/proto/'    
        }

        java {
           srcDir 'src/main/java'
         }
    }
}

dependencies {      
     compile 'com.google.protobuf:protobuf-java:2.6.1'
}