记录器不会在本机可执行文件中触发
Recorder does not fire in native executable
在我们的设置中,我们执行了一些 STATIC-INIT 构建步骤,包括将所有资源路径添加到一个对象的列表中。我们为此使用记录器,因为在静态初始化阶段无法访问该对象。在 JVM 模式下,我们看到列表确实包含了所有资源路径。但是,在 Native 模式下情况并非如此。该列表仍然是空的,即使构建日志显示我们迭代了资源并将它们添加到列表中。
这就是我们的设置:
第一个:在运行时可访问并包含所有资源路径的文件。
@ApplicationScoped
public class ServiceResourcesList {
private List<String> resources;
public ServiceResourcesList() {
resources = new ArrayList<>();
}
public void addResource(String resource) {
this.resources.add(resource);
}
public List<String> getResources() {
return resources;
}
public List<String> getResources(Predicate<String> filter) {
return resources.stream().filter(filter).collect(Collectors.toList());
}
}
记录器,其中returns一个BeanContainerListener:
@Recorder
public class ServiceResourcesListRecorder {
public BeanContainerListener addResourceToList(String resource) {
return beanContainer -> {
ServiceResourcesList producer = beanContainer.instance(ServiceResourcesList.class);
producer.addResource(resource);
};
}
}
最后是(简化的)构建步骤。请注意,我们使用 BuildProducer,它应确保在应用 Recorder 方法之前已经注册了对象。
@BuildStep
@Record(STATIC_INIT)
void createResourceList(final BuildProducer<BeanContainerListenerBuildItem> containerListenerProducer, ServiceResourcesListRecorder recorder) {
// Some code to get the resource paths, but this could be anything
// ...
for (String resourcePath: resourcePaths) {
LOGGER.info(resourcePath + " added to recorder");
containerListenerProducer.produce(new BeanContainerListenerBuildItem(recorder.addResourceToList(resourcePath)));
}
}
我是不是做错了什么?记录器不应该用于本机可执行文件吗?我应该在某处添加 RegisterForReflection 吗?
谢谢
我们使用 RUNTIME-INIT 和静态方法解决了这个问题。
在我们的设置中,我们执行了一些 STATIC-INIT 构建步骤,包括将所有资源路径添加到一个对象的列表中。我们为此使用记录器,因为在静态初始化阶段无法访问该对象。在 JVM 模式下,我们看到列表确实包含了所有资源路径。但是,在 Native 模式下情况并非如此。该列表仍然是空的,即使构建日志显示我们迭代了资源并将它们添加到列表中。
这就是我们的设置:
第一个:在运行时可访问并包含所有资源路径的文件。
@ApplicationScoped
public class ServiceResourcesList {
private List<String> resources;
public ServiceResourcesList() {
resources = new ArrayList<>();
}
public void addResource(String resource) {
this.resources.add(resource);
}
public List<String> getResources() {
return resources;
}
public List<String> getResources(Predicate<String> filter) {
return resources.stream().filter(filter).collect(Collectors.toList());
}
}
记录器,其中returns一个BeanContainerListener:
@Recorder
public class ServiceResourcesListRecorder {
public BeanContainerListener addResourceToList(String resource) {
return beanContainer -> {
ServiceResourcesList producer = beanContainer.instance(ServiceResourcesList.class);
producer.addResource(resource);
};
}
}
最后是(简化的)构建步骤。请注意,我们使用 BuildProducer,它应确保在应用 Recorder 方法之前已经注册了对象。
@BuildStep
@Record(STATIC_INIT)
void createResourceList(final BuildProducer<BeanContainerListenerBuildItem> containerListenerProducer, ServiceResourcesListRecorder recorder) {
// Some code to get the resource paths, but this could be anything
// ...
for (String resourcePath: resourcePaths) {
LOGGER.info(resourcePath + " added to recorder");
containerListenerProducer.produce(new BeanContainerListenerBuildItem(recorder.addResourceToList(resourcePath)));
}
}
我是不是做错了什么?记录器不应该用于本机可执行文件吗?我应该在某处添加 RegisterForReflection 吗?
谢谢
我们使用 RUNTIME-INIT 和静态方法解决了这个问题。