项目开发定制
关于第三方框架的情况:
- A:完全不支持(比如内部有动态编译或字节码类)
- B:支持,但是需要自己实验后加很多配置
- "mysql-connector-java:5.x" 属于这种情况
- C:支持,只需要自己再补点配置
- "mysql-connector-java:8.x" 属于这种情况
- D:完全支持(一般自己带了 native-image 元信息配置的)
1、项目定制
项目定制,一般是处理 "B" 和 "C" 两种情况,以及自己项目中一些特殊的使用。基本原则就是:
- 所有反射,需要申明登记
- 所有资源,需要申明登记
这里讲的项目定制,全是基于 solon-aot 提供的 "RuntimeNativeRegistrar" 接口完成上面两件事情。
public interface RuntimeNativeRegistrar {
void register(AppContext context, RuntimeNativeMetadata metadata);
}
2、定制示例 demo4013-wood_native :
这个示例,只需要增加 "mysql-connector-java:8.x" 的资源登记:
@Component
public class RuntimeNativeRegistrarImpl implements RuntimeNativeRegistrar {
@Override
public void register(AppContext context, RuntimeNativeMetadata metadata) {
metadata.registerResourceInclude("com.mysql.jdbc.LocalizedErrorMessages.properties");
}
}
3、定制示例 nginxWebUI:
这个示例就复杂一些,是已有项目改造过来,大约花费了大半天:
@Component
public class RuntimeNativeRegistrarImpl implements RuntimeNativeRegistrar {
@Override
public void register(AppContext context, RuntimeNativeMetadata metadata) {
metadata.registerResourceInclude("acme.zip");
metadata.registerResourceInclude("banner.txt");
metadata.registerResourceInclude("mime.types");
metadata.registerResourceInclude("nginx.conf");
metadata.registerResourceInclude("messages_en_US.properties");
metadata.registerResourceInclude("messages.properties");
metadata.registerSerialization(JSONConverter.class);
metadata.registerSerialization(AsycPack.class);
metadata.registerSerialization(JsonResult.class);
metadata.registerSerialization(Server.class.getPackage());
metadata.registerReflection(ProviderFactory.class, MemberCategory.INVOKE_DECLARED_METHODS);
metadata.registerReflection(BufferedImage.class, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
MemberCategory.INVOKE_DECLARED_METHODS);
metadata.registerReflection(JSONConverter.class, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS,
MemberCategory.INVOKE_DECLARED_METHODS);
}
}