起因
很早之前就一直在維護一個git倉庫,平時調研什麼元件就會在裡面新建一個springboot的工程用來編寫示例程式碼。
最一開始使用的是SpringInitializr,後來網站更新之後,只能生成JDK17+的工程,WhatTheFuck?近期剛從8切換到11.
於是棄用並改用 StartAliyun。
今天調研ClickHouse,生成的工程pom-build是這個樣子的 :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.ramble.clickhouse.ClickhouseApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
然後發現打的jar只有7KB,WhatTheFuck!我需要它能生成可以正常執行的jar。
後面就是圍繞怎麼讓maven輸出jar展開了。
使用Spring-boot-maven-plugin打包
思慮片刻,想起來了,之前遇到過這樣的問題,原因是用maven-compiler-plugin打包就不行,需要用Spring-boot-maven-plugin,於是刪除了 maven-compiler-plugin 所在的plugin節點。
新問題出現了:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project clickhouse: Compilation failure: Compilation failure:
[ERROR] 不再支援源選項 5。請使用 6 或更高版本。
[ERROR] 不再支援目標選項 1.5。請使用 1.6 或更高版本。
WhatTheFuck!!!怎麼還1.5了,那裡冒出來的,明明在StartAliyun選中的是11。
解決1.5問題
可以肯定的是打包的時候找到的JDK版本是1.5,而預期的是11,預期和實際不一致,所以是設定的問題。
按照經驗來說這時候該檢查 IDEA SETTINGS 和 ProjectStructure了,檢查的結果是這兩個位置確實是1.5。
好訊息是報錯的直接原因找到了,壞訊息是根本原因還沒有找到。
在看一下報錯log,發現了這一句話:
Failed to execute goal......
也就是說它找的是全域性級別的設定,而不是我專案中設定的,那這個全域性是在哪裡呢?難道是maven的settings.xml?
同時將去掉的maven-compiler-plugin恢復回來package又正常了。這裡基本可以確認 goal 就是指 Maven 的settings.xml了, 因為maven-compiler-plugin中設定了JDK。
那問題太似乎簡單了,在settings.xml中設定一下不就行了,程式碼如下:
<profile>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
</profile>
滿心歡喜的試一波,哎喲,package不報錯了。
然而,生成的jar還是7KB。。。。。。 WhatTheFuck.....
先穩一波,雖然透過設定全域性解決了,但是也僅解決了當下的問題,萬一明天再搞個JDK22的專案,不還是會預期和實際不一致???
既然全域性的settings.xml中設定jdk生效,那工程中設定一樣生效,因為依稀記得好好好幾年前擼MAVEN的時候工程中的配置會覆蓋全域性的,於是在pom中的properties下新增上述配置,果然好使。
skip
後面的故事就是:
- 反覆觀看package-log
- 反覆檢驗生成的程式碼
- baidu&google
- chatGPT
- ......
最終,當我把這個工程的pom和其他正常的工程pom做對比的時候,發現多了一個skip=true的配置
<build>
<plugins>
<plugin>
......
<configuration>
......
<skip>true</skip>
</configuration>
......
</plugin>
</plugins>
</build>
skip什麼意思?跳過。
你要跳過什麼?反正你是跳過了!跳過了就7KB了!!!
精準搜尋了一下,這裡的跳過是:跳過打包 。
WhatTheFuck......
註釋這個之後,問題確實解決了,好了,天晴了,雨停了......
可是,為什麼StartAliyun預設要Skip=true呢?著實想不明白,不行我還得找找其他的 Initializr ,這個不喜歡用。
總結
- 遇事不要慌,心態最重要
- 不要怕麻煩,在不影響團隊和交付物的情況下,應該死磕
- 平時知識的積累還是需要系統化一些,不可留在皮毛,亦或是參差不齊,應該是由淺入深,結構化,系統化。這樣在遇到問題的時候排查思路和方向更靠譜