在构建和运行时初始化中都使用Quarkus本机构建类

时间:2019-12-19 16:03:13

标签: java quarkus graalvm-native-image

我有一个第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

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我们只是为了解决这个问题,在生成的代码中有一个像这样的静态初始化程序: 私有静态BinaryMessageEncoder ENCODER = new BinaryMessageEncoder(MODEL $,SCHEMA $); 私有静态BinaryMessageDecoder DECODER = new BinaryMessageDecoder(MODEL $,SCHEMA $);

我们将Avro代码生成中的Velocity模板修改为:

  1. 添加@io.quarkus.runtime.annotations.RegisterForReflection批注
  2. 使用延迟初始化在构造函数中初始化静态变量。
  3. 从运行时类init中删除这些类。 缺点是您必须维护自定义代码生成模板。不过,这相对容易,这是用于自动执行代码生成的maven配置:
<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>

您可以在https://github.com/apache/avro/tree/master/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic

中找到基本模板

答案 1 :(得分:0)

对不起,我来晚了,但是这里的问题是,当您要求SpecificDatumReader在运行时初始化时,在构建时初始化的另一个类要求SpecificDatumReader进行初始化。

因此,基本上,您需要做一些侦探工作来确定为什么要初始化该类,并可能将初始化该类的类也标记为运行时初始化。

请注意,有时可能会有些毛茸茸。