【问题标题】:JVM and Intellij uses the avro generated classes, not imported onesJVM 和 Intellij 使用 avro 生成的类,而不是导入的类
【发布时间】:2018-11-20 08:36:51
【问题描述】:

在使用商业中心 Gradle 插件从 Avro 方案生成 java 代码时,它采用具有 字段 的对象,例如

"name": "ruleKey",
"type": [
  "null",
  {
    "type": "enum",
    "name": “Rule”,
    "namespace": "com.testing.common.rules.api",
    "symbols": [
      "MIN_AGE",
      “MAX_AGE”
    ]
  }
]

,并从方案中生成Java类,包括Rule等枚举字段。同时,我正在导入常见的 rules(com.testing.common.rules.api),它也导入了 Rule。我想使用公共库中的方法,但是,Avro 生成的模型具有更高的优先级。 (Java 解释器将按照它们在类路径变量中出现的顺序在目录中查找类。在这种情况下,是从方案生成的类)并且它不允许我使用从公共库中导入的类,因为 Avro已生成具有相同包和名称的规则枚举类。
使用的技术是 spring boot 2、Java 10 和commercehub.gradle 插件。

【问题讨论】:

    标签: java spring spring-boot serialization avro


    【解决方案1】:

    IDEA 尊重类路径排序。第一场比赛获胜(正如您已经发现的那样) - 因此您必须在项目/模块类路径设置中重新排序类路径元素。

    【讨论】:

      【解决方案2】:

      实际上,您在问题中列出的所有内容都不重要。如:您有两个同名的类 x.y.Z 和包。

      那是行不通的。当您导入 x.y.Z 时,JVM 开始搜索类路径,并选择它找到的第一个类。对于that,您无能为力。

      因此,唯一的解决方案是:确保您的类路径only 包含您打算使用的类。这也是为未来做好准备,因为 Java9 将 not allow 让您拥有两个具有冲突 x.y.Z 类的模块(在同一层中)。

      【讨论】:

      • 其实我没有说一部分,在我的例子中,字段 Rule 来自一个公共库。规则是方案中的一个字段,同时它是由项目导入的。当我们从方案中生成 java 代码时,JVM 将其理解为两个具有相同名称的类和包。不过基本一样,一个是从Avro方案生成的,一个是从公共库导入的。如果有办法“告诉”avro 插件不生成字段,使用现有的,它会解决问题。
      最近更新 更多