天天看點

Springboot jar包外指定配置檔案及原理

  • 解決方案:

    修改maven的pom.xml檔案

不拷貝資源檔案
<resources>
    <resource>
        <directory>src/main/resources</directory>
        <excludes>
            <exclude>*</exclude>
        </excludes>
        <filtering>true</filtering>
    </resource>
</resources>

修改打包方式
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <layout>ZIP</layout>
    </configuration>
</plugin>
           
  • 運作

    假設application.properties和application-{profile}.properties都在/tmp/temp/config,jar檔案在/tmp/temp

    java -Dloader.path=file:///tmp/temp/config,demo-1.0.jar -jar demo-1.0.jar

  • 原理

    對比jar包中MANIFEST.MF檔案在`ZIP配置前後的差別

    配置前:

Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.chinaunicom.gateway.GatewayApplication
           

     配置後:

Main-Class: org.springframework.boot.loader.PropertiesLauncher
Start-Class: com.chinaunicom.gateway.GatewayApplication
           

     發現是類加載器變了,檢視org.springframework.boot.loader包下所有加載器實作:

Springboot jar包外指定配置檔案及原理

     檢視五個類描述:官方文檔

  • JarLauncher

    Launcher for JAR based archives. This launcher assumes that dependency jars are included inside a /BOOT-INF/lib directory and that application classes are included inside a /BOOT-INF/classes directory.

  • WarLauncher

    Launcher for WAR based archives. This launcher for standard WAR archives. Supports dependencies in WEB-INF/lib as well as WEB-INF/lib-provided, classes are loaded from WEB-INF/classes.

  • PropertiesLauncher

    Launcher for archives with user-configured classpath and main class via a properties file. This model is often more flexible and more amenable to creating well-behaved OS-level services than a model based on executable jars.

    Looks in various places for a properties file to extract loader settings, defaulting to application.properties either on the current classpath or in the current working directory. The name of the properties file can be changed by setting a System property loader.config.name (e.g. -Dloader.config.name=foo will look for foo.properties. If that file doesn’t exist then tries loader.config.location (with allowed prefixes classpath: and file: or any valid URL). Once that file is located turns it into Properties and extracts optional values (which can also be provided overridden as System properties in case the file doesn’t exist):

    loader.path: a comma-separated list of directories (containing file resources and/or nested archives in .jar or .zip or archives) or archives to append to the classpath. BOOT-INF/classes,BOOT-INF/lib in the application archive are always used

    loader.main: the main method to delegate execution to once the class loader is set up. No default, but will fall back to looking for a Start-Class in a MANIFEST.MF, if there is one in ${loader.home}/META-INF.

  • spring-boot-maven-plugin幫助

    對zip格式說明

    對jar和war說明

繼續閱讀