【问题标题】:Why can't my local environment find generated Proto classes?为什么我的本地环境找不到生成的 Proto 类?
【发布时间】:2022-01-04 19:35:56
【问题描述】:

我有一个项目被设置为编译我的资源目录中指定的 protobufs。为此,我使用了xolstice 插件,配置如下:

<plugin>
  <groupId>org.xolstice.maven.plugins</groupId>
  <artifactId>protobuf-maven-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>compile</goal>
        <goal>compile-custom</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <protocArtifact>com.google.protobuf:protoc:${protobuf.version}:exe:${os.detected.classifier}</protocArtifact>
    <pluginId>grpc-java</pluginId>
    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
  </configuration>
</plugin>

这大致是here 描述的配置。有问题的原型包括一些对象模型以及我注册使用的 GRPC 服务。

.jar 很容易打包,maven-jar-plugin 我继承自我们共同的根 pom。配置如下:

<plugin>
  <artifactId>maven-jar-plugin</artifactId>
  <version>3.2.0</version>
  <configuration>
    <archive>
      <manifest>
        <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
        <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
      </manifest>
    </archive>
  </configuration>
</plugin>

当我在 IntelliJ 中运行我的项目时,一切似乎都运行良好 - 我可以观察到所需的原型已正确生成并且我没有任何问题。但是,当我用java -jar target/service.jar 运行.jar 时,我遇到了以下问题:

[Byte Buddy] ERROR com.artistchooser2.handlers.ChooseArtistsHandler [jdk.internal.loader.ClassLoaders$AppClassLoader@5c29bfd, unnamed module @776b83cc, Thread[main,5,main], loaded=false]
java.lang.IllegalStateException: Cannot resolve type description for com.artistChooser2.v1.ChooseArtistsServiceGrpc$ChooseArtistsServiceImplBase
    at net.bytebuddy.pool.TypePool$Resolution$Illegal.resolve(TypePool.java:161)
    at net.bytebuddy.pool.TypePool$Default$WithLazyResolution$LazyTypeDescription.delegate(TypePool.java:1038)

本应由协议编译步骤生成的类似乎无处可寻。然而,有趣的是,我可以通过运行:jar -tvf target/service.jar |grep 'ChooseArtistsServiceGrpc$ChooseArtistsServiceImplBase' 轻松确认这似乎已被破坏。如果我运行它,我可以观察到该类实际上是可用的并且与.jar 正确打包。我还可以通过仔细阅读 .jar 中的所有内容,在 IntelliJ 中轻松验证这一点。

我注意到这个问题是因为我正在设置一个测试,该测试在 Docker 映像中运行我的服务并验证它是否像在生产中一样正确启动。然而,有趣的是,虽然我无法在本地成功运行 mvn verify,但我的构建服务器(我已确认正在运行 mvn verify)运行完成没有问题。

我检查了所有常见的嫌疑人 - 它与构建服务器上使用的 maven 构建配置文件无关,maven 版本在构建服务器和本地是相同的,我已经甚至尝试清除.m2/repository,以防那里有什么可疑的东西。

所以我想我的问题是是否有人有任何进一步的线索?还有什么我应该研究的东西,某种环境变量,或者任何其他可能在本地导致上述异常但不在构建服务器上的东西?

【问题讨论】:

    标签: maven jar protocol-buffers grpc


    【解决方案1】:

    所以我仍然不完全确定这个问题究竟是如何表现出来的 - 在我的 .proto 规范中,我有:

    option java_package = "com.artistChooser2.v1";
    

    有趣的是,在我的本地机器上,当我在打包的 .jar 中找到编译后的 protos 时,它们出现在 com.artistchooser2.v1 下。注意小写的“c”。但是我正在运行的测试仍然在上面的“C”包中查找。

    由于某种原因,在构建服务器上,它们实际上是在正确的位置编译,但不是在我的本地 jar 上。我正在运行 Mac,而构建服务器是 Linux 机器。好奇它是否与环境有关。

    无论哪种方式,解决方案是将包名更改为我的机器所期望的,即较低的“c”,无论如何可能是一个更好的包名。

    【讨论】:

      猜你喜欢
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2014-05-10
      • 1970-01-01
      • 2022-10-06
      • 2019-03-30
      • 2016-09-08
      相关资源
      最近更新 更多