英文:
Gradle will pass in CLI and not Intellij (Instance method doesn't exist)
问题
以下是你要翻译的内容:
我在CI和本地上运行测试,并且它们通过了 gradle test
。但当我通过Intellij运行或尝试进行调试时,测试失败了,我在这个调用上得到了一个错误:
LogicalType type = schema.getLogicalType();
实际上,这是我们依赖项中的一个外部函数调用。
> java.lang.NoSuchMethodError: 'org.apache.avro.LogicalType org.apache.avro.Schema.getLogicalType()'
我不确定如何解决这个问题,这是类路径上的冲突jar包吗?
Avro的依赖关系图如下:
❯ gradle dependencies | grep -i avro
| | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1
| | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 (*)
| | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 (*)
| | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 (*)
| \--- org.apache.avro:avro:1.9.1 (*)
| +--- org.apache.avro:avro:1.9.1 (*)
| \--- org.apache.avro:avro:1.9.0 -> 1.9.1 (*)
+--- io.confluent:kafka-avro-serializer:5.3.1
| +--- org.apache.avro:avro:1.8.1 -> 1.9.1 (*)
| | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 (*)
+--- io.confluent:kafka-streams-avro-serde:5.3.1
| +--- io.confluent:kafka-avro-serializer:5.3.1 (*)
| +--- org.apache.avro:avro:1.8.1 -> 1.9.1 (*)
\--- org.apache.avro:avro:1.9.1 (*)
+--- io.confluent:kafka-avro-serializer:5.3.1 (n)
+--- io.confluent:kafka-streams-avro-serde:5.3.1 (n)
| | | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1
| | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 (*)
| | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 (*)
| | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 (*)
| | +--- org.apache.avro:avro:1.9.1 (*)
| +--- io.confluent:kafka-avro-serializer:5.3.1
| | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 (*)
| | | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 (*)
| | +--- org.apache.avro:avro:1.9.0 -> 1.9.1 (*)
| | | +--- org.apache.avro:avro:1.9.0 -> 1.9.1 (*)
| | | \--- org.apache.avro:avro:1.9.1 (*)
| +--- io.confluent:kafka-streams-avro-serde:5.3.1
| | +--- io.confluent:kafka-avro-serializer:5.3.1 (*)
| | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 (*)
| +--- org.apache.avro:avro:1.9.1 (*)
| +--- io.confluent:kafka-avro-serializer:5.3.2 -> 5.3.1 (*)
+--- io.confluent:kafka-avro-serializer:5.3.1 (*)
+--- io.confluent:kafka-streams-avro-serde:5.3.1 (*)
| | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1
| | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 (*)
| | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 (*)
| | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 (*)
| \--- org.apache.avro:avro:1.9.1 (*)
| +--- org.apache.avro:avro:1.9.1 (*)
| \--- org.apache.avro:avro:1.9.0 -> 1.9.1 (*)
+--- io.confluent:kafka-avro-serializer:5.3.1
| +--- org.apache.avro:avro:1.8.1 -> 1.9.1 (*)
| | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 (*)
+--- io.confluent:kafka-streams-avro-serde:5.3.1
| +--- io.confluent:kafka-avro-serializer:5.3.1 (*)
| +--- org.apache.avro:avro:1.8.1 -> 1.9.1 (*)
| \--- org.apache.avro:avro:1.9.1 (*)
| | | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1
| | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 (*)
| | | | |
<details>
<summary>英文:</summary>
I run tests on CI and local and they pass with `gradle test`. When I run via Intellij or try to debug, they fail and I get a failure on this call:
`LogicalType type = schema.getLogicalType();` This is actually an external function call in one of our dependencies.
> java.lang.NoSuchMethodError: 'org.apache.avro.LogicalType org.apache.avro.Schema.getLogicalType()'
I'm not sure how to get around this, is this conflicting jars on the classpath?
Dependency graph on Avro
❯ gradle dependencies | grep -i avro
| | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1
| | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| --- org.apache.avro:avro:1.9.1 ()
| +--- org.apache.avro:avro:1.9.1 ()
| --- org.apache.avro:avro:1.9.0 -> 1.9.1 ()
+--- io.confluent:kafka-avro-serializer:5.3.1
| +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
| | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
+--- io.confluent:kafka-streams-avro-serde:5.3.1
| +--- io.confluent:kafka-avro-serializer:5.3.1 ()
| +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
--- org.apache.avro:avro:1.9.1 ()
+--- io.confluent:kafka-avro-serializer:5.3.1 (n)
+--- io.confluent:kafka-streams-avro-serde:5.3.1 (n)
| | | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1
| | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| | +--- org.apache.avro:avro:1.9.1 ()
| +--- io.confluent:kafka-avro-serializer:5.3.1
| | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
| | | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
| | +--- org.apache.avro:avro:1.9.0 -> 1.9.1 ()
| | | +--- org.apache.avro:avro:1.9.0 -> 1.9.1 ()
| | | --- org.apache.avro:avro:1.9.1 ()
| +--- io.confluent:kafka-streams-avro-serde:5.3.1
| | +--- io.confluent:kafka-avro-serializer:5.3.1 ()
| | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
| +--- org.apache.avro:avro:1.9.1 ()
| +--- io.confluent:kafka-avro-serializer:5.3.2 -> 5.3.1 ()
+--- io.confluent:kafka-avro-serializer:5.3.1 ()
+--- io.confluent:kafka-streams-avro-serde:5.3.1 ()
| | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1
| | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| --- org.apache.avro:avro:1.9.1 ()
| +--- org.apache.avro:avro:1.9.1 ()
| --- org.apache.avro:avro:1.9.0 -> 1.9.1 ()
+--- io.confluent:kafka-avro-serializer:5.3.1
| +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
| | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
+--- io.confluent:kafka-streams-avro-serde:5.3.1
| +--- io.confluent:kafka-avro-serializer:5.3.1 ()
| +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
| --- org.apache.avro:avro:1.9.1 ()
| | | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1
| | | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| | | | | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| | | +--- org.apache.avro:avro:1.7.7 -> 1.9.1 ()
| | +--- org.apache.avro:avro:1.9.1 ()
| +--- io.confluent:kafka-avro-serializer:5.3.1
| | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
| | | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
| | +--- org.apache.avro:avro:1.9.0 -> 1.9.1 ()
| | | +--- org.apache.avro:avro:1.9.0 -> 1.9.1 ()
| | | --- org.apache.avro:avro:1.9.1 ()
| +--- io.confluent:kafka-streams-avro-serde:5.3.1
| | +--- io.confluent:kafka-avro-serializer:5.3.1 ()
| | +--- org.apache.avro:avro:1.8.1 -> 1.9.1 ()
| +--- org.apache.avro:avro:1.9.1 ()
| +--- io.confluent:kafka-avro-serializer:5.3.2 -> 5.3.1 ()
+--- io.confluent:kafka-avro-serializer:5.3.1 ()
+--- io.confluent:kafka-streams-avro-serde:5.3.1 ()
</details>
# 答案1
**得分**: 0
看起来你的类路径上有两个不同版本的Avro。尝试使用Gradle列出依赖项(参见[文档][1]),你可能会在那里找到问题。
编辑:
似乎你的应用间接依赖于Avro 1.7.7、1.8.1、1.9.0和1.9.1。
你应该使用依赖约束来确保只使用一个版本。
详细信息请参见[这里][2]。
[1]: https://docs.gradle.org/current/userguide/userguide_single.html#sec:listing_dependencies
[2]: https://docs.gradle.org/current/userguide/dependency_constraints.html
<details>
<summary>英文:</summary>
It look like you have two different versions of Avro on classpath. Try to list dependencies with Gradle (see [documentation][1]) - you may see the problem there.
Edit:
It seems your app is indirectly dependent on Avro 1.7.7, 1.8.1, 1.9.0 and 1.9.1.
You should use dependency constraints to make sure your're using only one version.
See [here][2] for details.
[1]: https://docs.gradle.org/current/userguide/userguide_single.html#sec:listing_dependencies
[2]: https://docs.gradle.org/current/userguide/dependency_constraints.html
</details>
专注分享java语言的经验与见解,让所有开发者获益!
评论