我有一个第3方类,它是由Quarkus添加到构建时初始化的,但是由于静态线程的使用,它需要运行时初始化。将其添加到运行时初始化时,本机版本会抱怨两者都存在。
重现此示例项目:https://github.com/hshorter/quarkus-avro-decode-example
通过“ --initialize-at-run-time = org.apache.avro.specific.SpecificDatumReader”:
错误:应该在运行时初始化的类已初始化 在图像构建期间:org.apache.avro.specific.SpecificDatumReader 要求在构建时初始化该类(从 命令行)。看看为什么 org.apache.avro.specific.SpecificDatumReader已初始化使用 -H:+ TraceClassInitialization
没有“ --initialize-at-run-time = org.apache.avro.specific.SpecificDatumReader”:
错误:在图像堆中检测到启动的线程。正在运行的线程 图像生成器不再在图像运行时运行。查看 如何使用-H:+ TraceClassInitialization实例化此对象。的 对象可能是由类初始化程序创建的,并且可以访问 从静态字段。您可以在图像运行时请求类初始化 通过使用--initialize-at-build-time =选项设置时间。要么 您可以编写自己的初始化方法并显式调用它们 从您的主要切入点开始。详细消息:跟踪:对象 org.apache.avro.specific.SpecificDatumReader
非常感谢任何帮助。
答案 0 :(得分:1)
我们只是为了解决这个问题,在生成的代码中有一个像这样的静态初始化程序: 私有静态BinaryMessageEncoder ENCODER = new BinaryMessageEncoder(MODEL $,SCHEMA $); 私有静态BinaryMessageDecoder DECODER = new BinaryMessageDecoder(MODEL $,SCHEMA $);
我们将Avro代码生成中的Velocity模板修改为:
@io.quarkus.runtime.annotations.RegisterForReflection
批注<plugin>
<groupId>org.apache.avro</groupId>
<artifactId>avro-maven-plugin</artifactId>
<version>${avro.version}</version>
<executions>
<execution>
<id>schemas</id>
<phase>generate-sources</phase>
<goals>
<goal>schema</goal>
</goals>
<configuration>
<templateDirectory>${project.basedir}/src/main/resources/avro/templates/</templateDirectory>
</configuration>
</execution>
</executions>
</plugin>
中找到基本模板
答案 1 :(得分:0)
对不起,我来晚了,但是这里的问题是,当您要求SpecificDatumReader
在运行时初始化时,在构建时初始化的另一个类要求SpecificDatumReader
进行初始化。
因此,基本上,您需要做一些侦探工作来确定为什么要初始化该类,并可能将初始化该类的类也标记为运行时初始化。
请注意,有时可能会有些毛茸茸。