当前位置: 首页 > 知识库问答 >
问题:

生成和运行时初始化中的Quarkus本机生成类

颛孙飞
2023-03-14

我有一个由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进行了初始化

如果没有"--初始化-在运行时=org.apache.avro.specific.特定数据读取器":

错误:在映像堆中检测到已启动的线程。映像生成器中运行的线程不再在映像运行时运行。要查看此对象是如何实例化的,请使用-H:traceClassification。该对象可能是由类初始值设定项创建的,可以从静态字段访问。您可以使用选项--initializeatbuildtime=,在映像运行时请求类初始化。或者您可以编写自己的初始化方法,并从主入口点显式调用它们。详细消息:跟踪:对象组织。阿帕奇。阿夫罗。具体的特殊数据读取器

非常感谢您的帮助。

共有2个答案

邓昊天
2023-03-14

抱歉,我迟到了,但您遇到的问题是,当您要求在运行时初始化 SpecificDatumReader 时,在构建时初始化的另一个类需要 SpecificDatumReader被初始化。

因此,基本上,您需要做一些检测工作来确定初始化这个类的原因,并可能将初始化该类的类标记为运行时已初始化。

请注意,有时它可能有点毛茸茸的。

刘凡
2023-03-14

我们刚刚解决了这个问题,在生成的代码中有这样一个静态初始值设定项:private static BinaryMessageEncoder=new BinaryMessageEncoder(MODEL$,SCHEMA$);私有静态BinaryMessageDecoder=新的BinaryMessageDecoder(型号$,模式$);

我们修改了Avro代码生成中的Velforce模板:

  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 找到基本模板

 类似资料:
  • 当我建立一个本土形象时,我面临着一个反思的问题 通用域名格式。神谕svm。主持。代替DeletedElementException:不支持的java字段。朗,同学们。newInstanceCallerCache是可访问的:此元素的声明类已被替换,但替换类中不存在此元素 我该怎么修?我的环境GraalVM 20和Zulu OpenJdk11 我的pom

  • 我尝试使用Quarkus制作一个原生应用程序,但当我构建它时,它冻结了: > 我在Manjaro linux下,用github存储库安装了graalvm。

  • 我正在尝试使用GraalVM构建本机Quarkus映像,但遇到以下构建失败错误: 这是我第一次与GraalVM合作,所以我有点困惑。 以下是基本信息:Java版本17 Graavl VM版本graalvm-ce-javaV-22.1.0 我按照提供的步骤:https://stackoverflow.com/a/65837409/7584240和https://github.com/graalvm/

  • 我想通过Dockerfile部署quarkus builder映像。我们支持一个代理,我将所有linux代理设置都设置为大写和小写。 如果我运行Dockerfile,我会在gu命令中收到一条错误消息,以安装本机映像组件。以下是Dockerfile中的完整运行语句: 它返回一条错误消息,其中包含我必须设置一个http_proxy。在运行语句之前,我启动了一个prencv语句,因为我可以看到http_

  • 初始化类成员的确切时间? 在下面的代码中: B&C类的对象是什么时候创建的?并且它是否保证被创建? 一个专业的app到底该不该用这样的代码?

  • 问题内容: 我想为我编写的(纯粹是学术性的)玩具语言处理器编写一个非常小的概念验证JIT编译器,但是在中等高度的设计中遇到了一些麻烦。从概念上讲,我熟悉JIT的工作原理- 您将字节码编译为(机器或汇编语言)代码以运行。但是,从细节上讲,我不太 了解 您实际如何 执行 此操作。 我(非常“ newb”)下意识的反应,因为我没有从哪里开始的第一个线索,将尝试执行以下操作: mmap()一个内存块,设置