对于 C# 文件的编译,我们所有的 .proto 文件都包含如下行:
option (google.protobuf.csharp_file_options).namespace = "com.test.foo.SomeClass";
我也想为 java 使用这些 proto 文件(我有必要的 java_package 选项集),但是如果我编译我会得到各种各样的错误。删除这个 csharp 东西可以很好地编译 Java。
无论如何我可以使用相同的文件为 C# 和 Java 编译吗?
使用 proto2、protoc 2.5 和 protobuf-java 2.5
编辑:这是一些 Java 编译错误:
com.test.foo.protobuf.CSharpOptions cannot be resolved to type
com.test.foo.protobuf.CSharpOptions cannot be resolved to a variable
EDIT2:构建过程只是一个运行这个的脚本:
${PROTOC} -I=/absolute/path/to/proto --java_out=src/main/java /absolute/path/to/proto/*.proto
EDIT3:这是一个简单的例子。这是我的目录结构:
[~/source/shared/example]$ find .
.
./Contact.proto
./google
./google/protobuf
./google/protobuf/descriptor.proto
./google/protobuf/csharp_options.proto
csharp_options.proto 和描述符可以在这里找到。
这是 Contact.proto 的内容:
package Example.Data.ProtocolBuffer;
import "google/protobuf/csharp_options.proto";
option java_package = "com.example.data.protobuf";
option java_outer_classname = "ContactProto";
option (google.protobuf.csharp_file_options).namespace = "Example.Data.ProtocolBuffer.Contact";
message Contact {
required string name = 1;
required string address = 2;
repeated int32 rank = 3;
}
执行 protoc 脚本后(参见编辑 2),它会创建以下内容:
[~/source/prototest]$ find .
.
./src
./src/main
./src/main/java
./src/main/java/com
./src/main/java/com/example
./src/main/java/com/example/data
./src/main/java/com/example/data/protobuf
./src/main/java/com/example/data/protobuf/ContactProto.java
目前我只是使用 Eclipse 进行编译。(还没有行家)。在 Eclipse 中,它报告以下编译器错误:
google cannot be resolved ContactProto.java
google cannot be resolved to a variable ContactProto.java
这是有问题的代码:
...
com.google.protobuf.ExtensionRegistry registry = com.google.protobuf.ExtensionRegistry.newInstance();
registry.add(google.protobuf.CsharpOptions.csharpFileOptions); //compiler error
return registry;
}
};
com.google.protobuf.Descriptors.FileDescriptor
.internalBuildGeneratedFileFrom(descriptorData,
new com.google.protobuf.Descriptors.FileDescriptor[] {
google.protobuf.CsharpOptions.getDescriptor(), //compiler error
}, assigner);
}
如您所见,它期望 CsharpOptions 存在,但事实并非如此。