[筆記]spring boot打包jar和war

  1. 打包jar
    Spring官網Guides下任意一個例子,比如最簡單的Building a RESTful Web Service

  2. 打包war
    參考Spring Boot文檔 Traditional deployment 85.1 Create a deployable war file
    或例程 spring-boot-sample-war

    按例程看,如果@SpringBootApplication的class直接繼承了SpringBootServletInitializer,不用重寫config方法也是可以的(builder.main(getClass())、get的就是應用class)。

  3. 打包一個又能發佈於tomcat又能java -jar直接跑的war
    2的參考文檔裏有:

    If you’re using the Spring Boot build tools, marking the embedded servlet container dependency as provided will produce an executable war file with the provided dependencies packaged in a lib-provided directory.

    另外:
    Maven 66.2 Packaging executable jar and war files
    Gradle 67.3 Packaging executable jar and war files

    觀察幾種配置的發佈包子目錄和其下jar包,並比較MENIFEST.MF:
    bootRun時有:

    Start-Class: hello.Application
    Spring-Boot-Classes: BOOT-INF/classes/
    Spring-Boot-Lib: BOOT-INF/lib/
    Main-Class: org.springframework.boot.loader.JarLauncher

    不過關心的是war包:

    Start-Class: hello.Application
    Spring-Boot-Classes: WEB-INF/classes/
    Spring-Boot-Lib: WEB-INF/lib/
    Main-Class: org.springframework.boot.loader.WarLauncher

    應該是丟給tomcat時、tomcat只檢查servlet定義的WEB-INF/lib路徑,但java -jar時、Spring的WarLauncher還引入了存放着tomcat相關jar的lib-provided目錄:

    @Override
    public boolean isNestedArchive(Archive.Entry entry) {
        if (entry.isDirectory()) {
            return entry.getName().equals(WEB_INF_CLASSES);
        }
        else {
            return entry.getName().startsWith(WEB_INF_LIB)
                    || entry.getName().startsWith(WEB_INF_LIB_PROVIDED);
        }
    }

    所以兩種都能跑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章