1

Im trying to create grpc service in java. Problem is in server creation:

    public static void main(String[] args) throws IOException, InterruptedException {

        Server server = ServerBuilder.forPort(50051)
                .addService(new AccountServiceGRPC())
                .addService(ProtoReflectionService.newInstance()) // added Reflection
                .build();
server.start();
        System.out.println("Started");

        // Shutdown: Using Runtime shutdown server [Imp: before await Termination]
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            System.out.println("Received Shutdown Request");
            server.shutdown();
            System.out.println("Successfully, Stopped Shutdown the server");
        }));
        server.awaitTermination();
    }
}

i get error:

Exception in thread "main" java.lang.NoSuchMethodError:
com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;CLjava/lang/Object;)V
    at io.grpc.Metadata$Key.validateName(Metadata.java:629)
    at io.grpc.Metadata$Key.<init>(Metadata.java:637)
    at io.grpc.Metadata$Key.<init>(Metadata.java:567)
    at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:742)
    at io.grpc.Metadata$AsciiKey.<init>(Metadata.java:737)
    at io.grpc.Metadata$Key.of(Metadata.java:593)
    at io.grpc.Metadata$Key.of(Metadata.java:589)
    at io.grpc.internal.GrpcUtil.<clinit>(GrpcUtil.java:86)
    at io.grpc.internal.AbstractServerImplBuilder.<clinit>(AbstractServerImplBuilder.java:60)
    at io.grpc.netty.shaded.io.grpc.netty.NettyServerProvider.builderForPort(NettyServerProvider.java:39)
    at io.grpc.netty.shaded.io.grpc.netty.NettyServerProvider.builderForPort(NettyServerProvider.java:24)
    at io.grpc.ServerBuilder.forPort(ServerBuilder.java:41)
    at com.example.demo.DemoApplication.main(DemoApplication.java:19)

Process finished with exit code 1

Thanks for answers.

Eric Anderson
  • 24,057
  • 5
  • 55
  • 76

1 Answers1

1

It appears Guava is being downgraded. I assume you are using Maven, since Maven uses the "nearest definition" mechanism for choosing dependency versions which trivially downgrades dependencies. The grpc-java team suggests always using Maven Enforcer's requireUpperBoundDeps to detect when Maven is choosing poor versions of dependencies.

    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.4.1</version>
        <executions>
          <execution>
            <id>enforce</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireUpperBoundDeps/>
              </rules>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>

When a package downgrade is detected, choose the largest version and add that dependency explicitly to your project, which will be the "nearest definition".

<dependencies>
  ...
  <dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>23.6-jre</version>
  </dependency>
</dependencies>
Eric Anderson
  • 24,057
  • 5
  • 55
  • 76