spring boot源碼編譯踩坑記

在Github上下載了Spring Boot 的源碼後,折騰了我幾天才終於把這貨給編譯成功,併成功build出IDEA的project出來了,官方埋坑真的是天理不容啊。java

我下載的是spring boot 2.1.8,下載後照着網上的文章執行指令:mvnw clean install -DskipTests -Pfast 而後就是半天動都不動,也不知道發生了什麼。後面我就加多了個debug日誌輸出, 仍是什麼都沒有輸出。。。git

搜了一下 mvnw,原來這傢伙全名maven wrapper,它的原理是在maven-wrapper.properties文件中記錄你要使用的maven版本,當用戶執行mvnw clean 命令時,發現當前用戶的maven版本和指望的版本不一致,那麼就下載指望的版本,而後用指望的版原本執行mvn命令。也就是這個東西有兩個做用,一個是不須要你事先安裝maven,一個是保證你build的時候使用的maven保持一致。github

後來看到這篇文章《學Spring Boot不能裝! 🤣不裝Maven、Database、Tomcat 纔是正常開發模式》,原來mvnw第一次運行會檢測$USER_HOME/.m2/wrapper/dists 目錄下是否有maven-wrapper.properties中指定的Maven版本,若是沒有就自動下載。好比我用的windows,就在目錄C:\Users\shahuwang\.m2\wrapper\dists裏有一個apache-maven-3.5.4-bin(剛纔執行mvnw時生成的),繼續打開,來到目錄C:\Users\shahuwang\.m2\wrapper\dists\apache-maven-3.5.4-bin\4lcg54ki11c6mp435njk296gm5 而後在裏面看到下載了部分的maven。spring

mvn那樣下載的方式特別特別慢,因此我直接用瀏覽器下載對應版本的maven,https://archive.apache.org/di... 3.5.4-bin.zip,而後放到C:\Users\shahuwang\.m2\wrapper\dists\apache-maven-3.5.4-bin\4lcg54ki11c6mp435njk296gm5裏即解決問題。注意必定要版本一致,且爲zip包。apache

另外,要注意修改C:\Users\shahuwang\.m2下maven的setting.xml,把官方源修改成阿里雲的源,否則會慢到死的。windows

搞定後,繼續執行mvnw clean install -DskipTests -Pfast,中間發現有幾回failed,都是繼續再執行命令就解決了,看起來應該是網絡鏈接中斷的問題,以前網上一直找也沒找到解決方案,沒想到就是build多幾回就解決了。瀏覽器

後面又遇到一個格式化的問題,mvnw spring-javaformat:apply 這個命令就解決了。網絡

最後執行 mvnw idea:idea 建立 IDEA 項目。intellij-idea

而後就遇到了checkstyle的問題,spring boot定義了一個nohttp的規則,不能用http域名,除非在白名單裏面。可是呢,它本身的文檔裏apache.org 這個域名用了http,又沒有放到白名單裏,而後一直編譯都經過不了,只是告訴我違反了規則,又沒有告訴我哪裏錯了。最後,終於搞清楚checkstyle的輸出,是放在主目錄下target/checkstyle-result.xml 裏面,找到裏面的error,就知道是哪裏的問題了。app

最坑爹的是,上述問題我解決了以後,從新下載全新的spring boot工程,執行mvnw clean install -DskipTests -Pfast就一會兒經過了,上述問題所有都沒有遇到,也難怪我搜索半天也找不到解決方案了,看起來maven仍是不太行。

最後的最後,又發現一個新的坑,生成了IDEA項目以後,發現默認的Language Level 就是 Java 5,這哪裏受得了呀。網上找到的方法都是加這麼一段:

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

經我驗證是行不通的,spring boot下面有不少的modules,上面這樣寫,要逐個module下的pom.xml去修改,太煩人了。最終在這個問答下找到了解決方案,要使用properties的方式,直接在主目錄下的pom.xml 下添加:

<properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

properties是僅次於project的二級目錄,通常狀況下都會有的,把中間那兩行放進去就好了。以後就完美解決問題了,自動使用java 11了

相關文章
相關標籤/搜索