gradle 本机映像:如何在Micronaut 3.7+中向生成的资源config.json添加自定义文件

moiiocjp  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(139)

在我的Micronaut应用程序中,我使用Google的LibPhoneNumber来解析和验证电话号码。

  • com/谷歌/i18 n/手机号码/data/手机号码元数据Proto_CH
  • com/谷歌/i18 n/手机号码/数据/短号码元数据Proto_CH
  • com/谷歌/i18 n/手机号码/data/手机号码元数据原型
  • com/谷歌/i18 n/手机号码/数据/短号码元数据Proto_DE
  • com/google/i18 n/电话号码/数据/电话号码元数据Proto_AT
  • com/谷歌/i18 n/电话号码/数据/短号码元数据Proto_AT
  • 更多...

是否有办法在Micronaut中的某个位置注册这些文件(例如Gradle插件或源代码中的注解),以便将这些自定义资源附加到Micronaut Gradle插件生成的resource-config.json中?
我计划使用以下模式注册ProtoBuf文件。

{
  "resources": {
    "includes": [
      {
        "pattern": "\\Qcom/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_CH\\E"
      }
    ],
    "excludes": []
  },
  "bundles": []
}

**注意:**Micronaut生成的资源模式在上面的列表中被省略了。

lp0sw83n

lp0sw83n1#

其中一种方法是创建一个自动注册的GraalVM特性。Micronaut检测Flyway迁移的方式给了我灵感,并注意到使用Resources#registerResource文件可以注册为本地映像。

import com.oracle.svm.core.annotate.AutomaticFeature;
import com.oracle.svm.core.jdk.Resources;
import java.util.List;
import org.graalvm.nativeimage.hosted.Feature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * A GraalVM feature that includes LibPhoneNumber ProtoBuf files.
 *
 * <p>Forked from Micronaut Flyway:
 * https://github.com/micronaut-projects/micronaut-flyway/blob/master/flyway/src/main/java/io/micronaut/flyway/graalvm/FlywayFeature.java
 *
 * @author Silvio Wangler
 * @since 0.1.0
 */
@AutomaticFeature
final class GoogleLibPhoneNumberFeature implements Feature {

  private static final Logger LOG = LoggerFactory.getLogger(GoogleLibPhoneNumberFeature.class);

  @Override
  public void beforeAnalysis(BeforeAnalysisAccess access) {

    List<String> countries = List.of("CH", "IT", "DE", "FR", "GB", "AT", "LI");

    for (String country : countries) {
      try {
        String resourceName =
            "com/google/i18n/phonenumbers/data/PhoneNumberMetadataProto_" + country;
        String resourceName2 =
            "com/google/i18n/phonenumbers/data/ShortNumberMetadataProto_" + country;
        Resources.registerResource(
            resourceName, access.getApplicationClassLoader().getResourceAsStream(resourceName));
        Resources.registerResource(
            resourceName2, access.getApplicationClassLoader().getResourceAsStream(resourceName2));
      } catch (Exception e) {
        LOG.error("Issue during processing Google LibPhoneNumber protobuf files", e);
      }
    }
  }
}

这是一个有限的实现,因为它不包括libphonenumber支持的所有国家。

相关问题