groovy 设置micronaut配置位置

eivgtgni  于 2022-11-01  发布在  其他
关注(0)|答案(2)|浏览(204)

我有一个现有的groovy micronaut应用程序,我试图改变它加载配置的位置。我不知道该写什么代码,这样我就可以设置micronaut配置的位置。我知道你可以使用micronaut.config.files系统变量或MICRONAUT_CONFIG_FILES环境变量,但这是一个糟糕的想法,因为micronaut内置在Grails中,因此在Tomcat中运行的每个Grails应用程序都将获得相同的配置并崩溃。
我也不知道在代码中的什么地方设置配置文件。当在Grails应用程序中设置配置时,有一个扩展EnvironmentAware的Application类,您可以覆盖setEnvironment,并在其中加载外部配置,但对于micronaut应用程序却没有任何暗示。
micronaut doco说它可以从“application.{extension}"加载一个配置,但是它没有说“application”是什么,或者它期望在哪个目录,或者你是否可以改变目录。“application”是一micronaut.application.name个人的application.yml中的www.example.com的值吗?我似乎不能根据这个来加载它。
然后文档讨论了从PropertySource加载,这很好,但没有告诉您可以将代码放在哪里以从PropertySource加载。有提到您可以将PropertySource传递到ApplicationContext.run(xx),但在我继承的这个应用程序中,没有提到ApplicationContext,并且micronaut文档并不十分清楚我应该如何处理ApplicationContextMicronaut.run。这显然返回了一个ApplicationContext,但不清楚在Tomcat中运行时是否调用了main(),或者当它按原样工作时,我是否应该在其上调用run(),我只是试图更改它加载其配置的位置。

cld4siwp

cld4siwp1#

问题是,我如何让我的micronaut应用程序从我告诉它的地方加载它的配置,而不是从micronaut.config.文件系统变量的位置。
我不认为我们在框架中有一个特定的特性,允许你告诉框架忽略micronaut.config.files。如果你想要这样的特性,你可以在https://github.com/micronaut-projects/micronaut-core/issues上请求它。如果你对此感兴趣,我建议你首先在https://github.com/micronaut-projects/micronaut-core/discussions上打开它进行讨论。

um6iljoc

um6iljoc2#

在运行应用程序之前,你可以在Application类的main方法中加载外部配置文件,该路径不是micronaut.config.files。看看下面的类,它接受配置文件夹位置作为系统属性demo.config.path(可以是其他内容),并从该文件夹加载yaml配置文件:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

import io.micronaut.context.env.PropertySource;
import io.micronaut.context.env.yaml.YamlPropertySourceLoader;
import io.micronaut.core.io.ResourceLoader;
import io.micronaut.core.io.file.DefaultFileSystemResourceLoader;
import io.micronaut.runtime.Micronaut;

public class Application {
    private static final String PROP_CONFIG_LOCATION = "demo.config.path";

    public static void main(String[] args) throws IOException {
        if (System.getProperty(PROP_CONFIG_LOCATION) != null) {
            List<PropertySource> propertySources = new ArrayList<>();
            YamlPropertySourceLoader propertySourceLoader = new YamlPropertySourceLoader();
            ResourceLoader resourceLoader = new DefaultFileSystemResourceLoader();

            Files.newDirectoryStream(Paths.get(System.getProperty(PROP_CONFIG_LOCATION))).forEach(file -> {
                String fileName = file.toString();
                String fileNameWithoutExtension = fileName.substring(0, fileName.lastIndexOf('.'));
                propertySourceLoader.load(fileNameWithoutExtension, resourceLoader).ifPresent(propertySources::add);
            });

            Micronaut.build(args)
                    .classes(Application.class)
                    .propertySources(propertySources.toArray(new PropertySource[1]))
                    .start();
        } else {
            Micronaut.run(Application.class, args);
        }
    }
}

按原样,此代码适用于yaml配置文件(类路径中包含snakeyaml)。只需稍作修改,即可使其适用于属性文件,并从环境变量(而不是系统属性)读取配置位置。完整的示例应用程序位于github

相关问题