rpm的外部化配置

时间:2016-09-19 09:18:02

标签: spring-boot rpm spring-boot-maven-plugin

INTRO:

这个问题与How to put a directory first on the classpath with Spring Boot?非常相似,我搜索了一下,但不幸的是到目前为止没有任何工作。根据{{​​3}}或boot features external config中的说明,无法更改为packaging=ZIP中的spring-boot-maven-plugin或使用loader.path,因此我必须遗漏某些内容。还有一件事,如果可能的话,我想避免将每个配置文件作为file://...的参数传递。

我有一个应用程序,它最初是几种服务的模拟器:sftp,soap等。最初它支持每个服务器类型的1个实例,可通过属性文件进行配置。

我现在更新它以支持不同端口上的多个服务器实例,并且配置在YAML文件中完成,我也从经典spring迁移到boot。最后,应用程序以RPM形式提供,具有以下结构

installation-dir
    |--bin
    |    '-- simulator.sh [lifecycle management script]
    |--config
    |    |--application.properties
    |    |--log4j2.xml
    |    |--samples       [sample files for various operations]
    |    |    |-- sample1.csv
    |    |    |-- sample2.csv
    |    |    '-- sample3.csv
    |    |--simulators.yaml [simulators config]
    |    '--simulator.jks
    |--lib
    |    '-- simulator-1.0.jar
    '--log
         '-- simulator.log

之前,simulators.sh启动了将类config目录添加到类路径的主类,而spring会加载属性文件而不会出现任何问题:

java <other args> -cp "..." com.whatever.SimulatorLauncher

自迁移以来,它现在启动生成的jar,因此不再使用-cp,并且我无法使其获取配置文件:

java <other args> lib/simulator-1.0.jar

忽略它没有找到aplication.properties的事实,模拟器的配置加载如下:

@Configuration
@ConfigurationProperties(locations = {"classpath:/simulators.yml"}, ignoreUnknownFields = false, prefix = "simulators")
public class SimulatorSettings {
    private static final Logger log = LoggerFactory.getLogger(SimulatorSettings.class);

    @NotNull
    private List<SftpSettings> sftp;

    @NotNull
    private List<SoapSettings> soap;

由于配置应该是可更新的而不必重新打包应用程序,所以所有文件都从生成的jar中排除,但打包在config下的rpm中:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <excludes>
                    <!-- these files will be included in the rpm under config -->
                    <exclude>application.properties</exclude>
                    <exclude>log4j2.xml</exclude>
                    <exclude>samples/**</exclude>
                    <exclude>simulators.yml</exclude>
                    <exclude>simulator.jks</exclude>
                </excludes>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>com.whatever.SimulatorLauncher</mainClass>
                <layout>ZIP</layout>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>rpm-maven-plugin</artifactId>
            <version>2.1.5</version>
            ...
            <configuration>
            ...
                    <mapping>
                        <directory>${rpm.app.home}/config</directory>
                        <sources>
                            <source>
                                <location>src/main/resources</location>
                                <includes>
                                    <include>application.properties</include>
                                    <include>simulators.yml</include>
                                    <include>log4j2.xml</include>
                                    <include>nls-sim.jks</include>
                                </includes>
                            </source>
                        </sources>
                        <filemode>755</filemode>
                    </mapping>

非常感谢任何帮助或提示。

1 个答案:

答案 0 :(得分:0)

我最终删除了spring-boot-maven-plugin以防止重新打包,并使用我的人工制品创建了RPM。它的依赖关系并像之前一样启动应用程序:

java <other args> -cp "<installation dir>/config:...:<libs>" com.whatever.SimulatorLauncher

尽管如此,我还是有兴趣知道是否有人知道如何使用弹簧靴重新包装的罐子来做这件事......