Загрузите необходимый файл .properties в зависимости от ОС - PullRequest
0 голосов
/ 08 января 2019

Существует два файла конфигурации для разных ОС windows.properties и unix.properties.

Есть конфигурация:

@Configuration
@ConfigurationProperties (prefix = "storage")
public class StorageProperties {

     private String root;
     private String sitesDirName;
     private String avatarsDirName;
     private String screenshotsDirName;

     @PostConstruct
     public void postConstruct () {

     }

}

Как сделать так, чтобы определенный файл загружался в зависимости от ОС? Я столкнулся с @Conditional, но это одно условие. Может быть, он поможет как-то.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

(1) Определение перечисления для ОС. Используйте системное свойство os.name для определения текущей ОС:

public enum OS {
    WINDOWS, UNIX, MAC, UNKNOWN;

    public static OS currentOS() {
        String OS = System.getProperty("os.name").toLowerCase();

        if (OS.indexOf("win") >= 0) {
            return WINDOWS;
        } else if (OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0) {
            return UNIX;
        } else if ((OS.indexOf("mac") >= 0)) {
            return MAC;
        } else {
            return UNKNOWN;
        }
    }
}

(2) Инвентарь ConditionalOnOS:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OsCondition.class)
public @interface ConditionalOnOS {
    OS os();
}

public class OsCondition implements Condition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

        MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(ConditionalOnOS.class.getName());
        if (attrs != null) {
            Object os = attrs.getFirst("os");
            if (os != null && os instanceof OS) {
                if (OS.currentOS().equals(((OS) os))) {
                    return true;
                }
            }
        }
        return false;
    }
}

(3) Настроить @ConfigurationProperties для разных ОС. Используйте @PropertySource, чтобы определить пути к файлам свойств для разных ОС:

@ConfigurationProperties(prefix = "storage")
public static class StorageProperties {
    private String root;
    private String sitesDirName;
    private String avatarsDirName;
    private String screenshotsDirName;

    @Configuration
    @PropertySource("classpath:windows.properties")
    @ConditionalOnOS(os = OS.WINDOWS)
    public static class WindowsStrogeProperties extends StorageProperties {

    }

    @Configuration
    @PropertySource("classpath:unix.properties")
    @ConditionalOnOS(os = OS.UNIX)
    public static class UnixStrogeProperties extends StorageProperties {

    }
}

(4) Внедрить StorageProperties клиенту

0 голосов
/ 08 января 2019

@Conditional было бы полезно определить операционную систему, посредством чего вам пришлось бы определять условные классы.

В качестве более короткого подхода вы можете использовать старые добрые операторы if для определения операционной системы. Предполагая, что у вас есть два разных файла, windows.properties и unix.properties, как предложено, создайте класс конфигурации для определения операционной системы и загрузите соответствующий файл .properties.

Код для класса конфигурации показан ниже.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import com.sun.javafx.PlatformUtil;

@Configuration
public class OSConfiguration {

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
                String osName = "";

    if (PlatformUtil.isWindows()) {
        osName = "windows";
    } else if (PlatformUtil.isUnix()) {
        osName = "unix";
    } else if (PlatformUtil.isMac()) {
        osName = "mac";
    }

    String propertiesFilename = osName + ".properties";
    PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
    configurer.setLocation(new ClassPathResource(propertiesFilename));

    return configurer;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...