Как сделать свойства maven доступными для файлов yaml dropwizard

Я использую пакет swagger для документирования своих ресурсов dropwizard. Ниже приводится файл yaml

swagger:
  resourcePackage: "com..resources"
  description: "<a href='http:/docsite/'>Workflow doc</a>"
  version: ${project.version}

Я хочу динамически обновить номер версии из файла POM, для которого я попробовал фильтрацию ресурсов maven

<resources>
    <resource>
    <directory>src/main/resources/docker</directory>
    <filtering>true</filtering>
    </resource>
</resources>

Это не оценивает версию проекта. Я понимаю, что оценка происходит в файлах, которые попадают в /target/ классы проекта.

Как я могу использовать это свойство maven в моем файле yaml?

Я также попробовал следующее в своем приложении classs

SwaggerBundleConfiguration swaggerConfig = configuration.getSwaggerBundleConfiguration();
    swaggerConfig.setVersion("${project.version}");

И изменение фильтрации ресурсов на

<resources>
        <resource>
        <directory>src/main/java</directory>
        <filtering>true</filtering>
        </resource>
    </resources>

Но я не вижу никаких изменений в пользовательском интерфейсе

1 ответ

Я придумал следующее решение. Итак, заполните файл свойств свойствами Maven, используя фильтрацию ресурсов Maven. Затем загрузите эти свойства в свое приложение и установите их как системные свойства. Наконец, настройте Dropwizard для замены переменных в YAML системными свойствами.

Предполагая, что переменная, которую мы пытаемся подставить в YAML, называется project.version:

  1. Создайте файл свойств в src/main/resources, В этом примере я назову это maven.properties,
  2. В maven.properties добавить недвижимость project.version=${project.version}
  3. В разделе сборки вашего pom, добавьте:

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    
  4. Создать реализацию org.apache.commons.lang3.text.StrSubstitutor который использует системные свойства в качестве источника поиска:

    package com.example.app;
    import org.apache.commons.lang3.text.StrLookup;
    import org.apache.commons.lang3.text.StrSubstitutor;

    /**
     * A custom {@link StrSubstitutor} using system properties as lookup source.
     */
     public class SystemPropertySubstitutor extends StrSubstitutor {
         public SystemPropertySubstitutor() {
             super(StrLookup.systemPropertiesLookup());
         }
     }
  1. В своем основном классе Application добавьте следующее к initialize:
    @Override
    public void initialize(final Bootstrap<AppConfiguration> bootstrap) {
        final Properties properties = new Properties();
        try {
            properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("maven.properties"));
            System.setProperty("project.version", properties.getProperty("project.version"));
        } catch (IOException e) {
            throw new IllegalStateException(e);
        }

        final StrSubstitutor substitutor = new SystemPropertySubstitutor();
        final ConfigurationSourceProvider configSourceProvider = new SubstitutingSourceProvider(bootstrap.getConfigurationSourceProvider(), substitutor);
        bootstrap.setConfigurationSourceProvider(configSourceProvider);
    }
Другие вопросы по тегам