关于第三方框架的情况：

* A：完全不支持（比如内部有动态编译或字节码类）
* B：支持，但是需要自己实验后加很多配置
  * "mysql-connector-java:5.x" 属于这种情况
* C：支持，只需要自己再补点配置
  * "mysql-connector-java:8.x" 属于这种情况
* D：完全支持（一般自己带了 native-image 元信息配置的）

### 1、项目定制

项目定制，一般是处理 "B" 和 "C" 两种情况，以及自己项目中一些特殊的使用。基本原则就是：

* 所有反射，需要声明登记
* 所有资源，需要声明登记

这里讲的项目定制，全是基于 [solon-aot](/article/499) 提供的 "RuntimeNativeRegistrar" 接口完成上面两件事情。

```java
public interface RuntimeNativeRegistrar {
    void register(AppContext context, RuntimeNativeMetadata metadata);
}

```

### 2、定制示例 [demo4013-wood_native](https://gitee.com/noear/solon-examples/tree/main/4.Solon-Data/demo4013-wood_native) ：

这个示例，只需要增加 "mysql-connector-java:8.x" 的资源登记：

```java
@Component
public class RuntimeNativeRegistrarImpl implements RuntimeNativeRegistrar {
    @Override
    public void register(AppContext context, RuntimeNativeMetadata metadata) {
        metadata.registerResourceInclude("com.mysql.jdbc.LocalizedErrorMessages.properties");
      
    }
}
```

### 3、定制示例 nginxWebUI ：

这个示例就复杂一些，是已有项目改造过来，大约花费了大半天：

```java
@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);

    }
}
```