Java Swing程式使用Gradle建置時,在執行或是打包jar檔會發生一些異常問題,整理一下遇到的問題和解法:
1.使用IntelliJ IDEA的GUI Designer開發Java Swing應用程式
在第一次執行時,會發生「contentPane cannot be set to null」的錯誤。從錯誤訊息看起來,為執行程式時,panel1物件為null,沒有使用GUI Designer所產生的UI配置的.form檔初始化UI上的物件。
main中程式碼:
2.修改IntelliJ設定
開啟File -> Settings
(1)Editor -> GUI Designer
將「Generate GUI into」設定改為「Java Source Code」
(2)Build, Execution, Deployment -> Build Tools -> Gradle
將「Build and run using」及「Run tests using」設定皆改為「IntelliJ IDEA」
3.重新Build Project自動產生GUI程式碼
(1)點Build Project
(2).form檔所綁定的class將自動產生GUI相關程式碼
- 這些自動產生的程式碼不可自行修改
- 在GUI Designer上編輯排版後,只要Build Project就會更新程式碼
(3)此時會發現自動產生的程式碼中有編輯器不認得的類別,所以要到build.gradle新增相依函式庫
implementation 'com.intellij:forms_rt:7.0.3'
新增後記得按下右邊大象圖案Load Gradle Changes
(4)成功編譯程式碼
4.再次執行程式
完成設定後即可從IntelliJ上成功執行Swing程式
5.打包成JAR檔 – 「沒有主要資訊清單屬性」錯誤
若Gradle使用預設設定,執行gradlw build產生的jar檔會發生「沒有主要資訊清單屬性」錯誤,如下圖:
這是因為jar檔中未指定Main-Class
在build.gradle檔中加入jar的manifest設定:
jar {
manifest {
attributes 'Main-Class': 'MainFrame'
}
}
6.打包成JAR檔 – 「java.lang.NoClassDefFoundError: com/intellij/uiDesigner/core/GridLayoutManager」錯誤
再重新執行gradle build並執行jar檔,此時會發生「Exception in thread “main” java.lang.NoClassDefFoundError: com/intellij/uiDesigner/core/GridLayoutManager」
解壓縮jar檔會發現裡面只有MainFrame.class,所有相依的library都沒被打包進去
build.gradle檔中再加入jar的from設定,將所有相依library打包進jar檔:
jar {
manifest {
attributes 'Main-Class': 'MainFrame'
}
from {
configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
7.成功打包可執行的JAR檔
完成build.gradle設定後,打包的JAR檔即可正常執行