更新为Jakarta/Java 17后,APT生成器停止工作

gev0vcfq  于 2023-01-01  发布在  Java
关注(0)|答案(1)|浏览(115)

我正在做一个由Spring和JavaEE组件组成的相当大的项目。现在,我正在从javax更新到jakartaEE,也从Java 11更新到17。构建工具包含几个模块,它们相互依赖。我已经做了一些修改,使第一个模块能够编译,现在我正在编译包含JPA实体的模块。
突然间,我发现自己处于这样一种情况,即不再创建元模型。
我在这里的基本假设是,Gradle本身不参与元模型的生成。相反,APT生成器将被移交给javac,然后javac会在编译之前识别并执行它们。我已经调试了gradle的执行,javac的processorpath选项包含了预期的jpa-metamodel.jar。因此,我认为,我更愿意看到Java问题,而不是Gradle问题。
我用相同的Java/Hibernate版本做了一个非常简单的POC项目,它在那里工作。在这个项目中,我能够验证元模型生成器发出了一个日志语句。如果源代码没有编译,也会发出这个语句。所以,它似乎是一个指示器,表明modelgen是否工作。这个日志消息没有写在我的主项目中。
另外,在jpa-metamodel旁边还有另外两个apt生成器,它们都有类似的行为,例如,在工作时打印出一行日志,但在我更新的项目中却没有,这让我想到,这不是jpa-metamodel-gen的问题,而是apt本身的问题。
接下来我该去哪里找?

    • 编辑**

我做了一些更多的研究。通过Gradle--debug我能够提取实际的javac调用。从控制台执行它显示了同样的错误。
我减少了要编译的元素的数量。看起来把一个实际的实体放在要编译的列表上会使APT生成器休眠。只把一个MappedEntity超类型放在列表上仍然会使APT保持活动状态。WTF?

    • 编辑2**

我现在正在创建一个可复制的示例,我已经跳过了很多与业务相关的库,现在,我有一个havac调用,其中-processorpath只提到了jpamodelgen,-classpath只提到了hibcore(都是6.1.6版)。
在这种情况下,modelgen不起作用,只要我去掉了hibernate-core,它就可以工作了。
下一步:我将剥离实体。

4nkexdtk

4nkexdtk1#

好吧,这是意料之外的。我把它压缩成一个最小的例子。这个问题需要一个类似于下面的调用:

javac \
  -processorpath hibernate-jpamodelgen-6.1.6.Final.jar\
  -classpath hibernate-core-6.1.6.Final.jar\
  BaseEntity.java

触发此问题的其他条件是,BaseEntity必须具有功能异常的@Type注解。@Type已将其签名从Hibernate 5更改为Hibernate 6,而我的实体尚未更新。
有趣的是,无论是generell编译错误还是带有其他注解的特定错误(我尝试了一个损坏的spring-Repository错误)都不会阻止modelgen工作(事实上,示例中的processorpath不完整)。
我将把这个问题报告给hib项目,因为我相信modelgen在这种情况下应该React得更优雅。
在此报告为漏洞:https://hibernate.atlassian.net/browse/HHH-15946

相关问题