请帮帮我,我真的被困住了。我是为协议缓冲器工作的maven插件。我分别添加了两个文件: hello.proto和hello2.proto。在构建项目时,我会收到诸如hello2.proto: Import "h/hello.proto“没有找到或有错误的错误。
hello.proto
syntax = "proto3";
//option java_multiple_files = true;
option java_package = "com.poc_cipertrace.hello";
option java_outer_classname = "HelloWorldRequest";
message HelloRequest {
string name = 1;
}hello.proto
syntax = "proto3";
option java_package = "com.poc.poc_cipertrace.hello";
option java_outer_classname = "HelloWorldResponse";
import "h/hello.proto";
message HelloResponse {
HelloRequest h=1;
}POM.XML
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.poc</groupId>
<artifactId>poc_cipertrace</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>poc_cipertrace</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>11</java.version>
<lombok.version>1.18.22</lombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.6.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty-shaded</artifactId>
<version>1.15.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-protobuf</artifactId>
<version>1.15.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-stub</artifactId>
<version>1.15.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.github.os72</groupId>
<artifactId>protoc-jar-maven-plugin</artifactId>
<version>3.6.0.1</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<includeMavenTypes>direct</includeMavenTypes>
<inputDirectories>
<include>src/main/resources/proto</include>
</inputDirectories>
<outputTargets>
<outputTarget>
<type>java</type>
<outputDirectory>src/main/java</outputDirectory>
</outputTarget>
<outputTarget>
<type>grpc-java</type>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.15.0</pluginArtifact>
<outputDirectory>src/main/java</outputDirectory>
</outputTarget>
</outputTargets>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>项目结构

预期的输出是Java应该根据包生成。我尝试过通过各种网站,但我无法获得预期的输出。
发布于 2022-11-07 17:08:48
我不使用Java,因此无法帮助您的POM.xml,但是,您的proto定义是不正确的,而且看起来是不必要的复杂。
TL;DR:假设您希望h和h2定义包,则必须在proto文件中引用它们,方法是添加与原始文件夹名路径匹配的package引用。在您的示例中,假设${PWD}/proto是proto路径,例如h/hello.proto表示包h
h/hello.proto
syntax = "proto3";
package h;
//option java_multiple_files = true;
option java_package = "com.poc.poc_cipertrace.hello";
option java_outer_classname = "HelloWorldRequest";
message HelloRequest {
string name = 1;
}h2/hello.proto
syntax = "proto3";
package h2;
option java_package = "com.poc.poc_cipertrace.hello";
option java_outer_classname = "HelloWorldResponse";
import "h/hello.proto";
message HelloResponse {
h.HelloRequest h=1;
}然后(不使用mvn,直接使用protoc ):
protoc \
--proto_path=${PWD}/proto \
--java_out=${PWD} \
${PWD}/proto/h/hello.proto \
${PWD}/proto/h2/hello.proto产量:
com
└── poc
└── poc_cipertrace
└── hello
├── HelloWorldRequest.java
└── HelloWorldResponse.java思想:
java_package值,但我假设您希望它们位于相同的com.pod.pod_cipertrace.hello名称空间中。HelloRequest和HelloResponse分割成不同的package,并使用相同的文件名(hello.proto),这将(应该!)合并成单个package中的单个proto。https://stackoverflow.com/questions/74349324
复制相似问题