(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
клиенту