IntelliJ IDEA + GUI Builder + Gradle - How to
Von Zeit zu Zeit baue ich Java Programme mit einem User Interface. Dies tue ich gerne mit dem IDEA GUI Designer, denn auch wenn Java UI generell eher nicht das idealste ist, manchmal ist sie einfach passend für den Einsatzzweck.
Zusätzlich nutze ich aber auch gerne Gradle als Build-Tool meiner Wahl. Die Kombination aus Gradle + IntelliJ IDEA + GUI Designer ist aber leider etwas problematisch und so hatte ich einige Probleme nach diversen Updates meiner Projekte, eine lauffähige JAR zu erzeugen.
Um euch diese Arbeit zu ersparen habe ich aus verschiedenen Stack Overflow Beiträgen (Beitrag #1 open_in_new, Beitrag #2 open_in_new, Beitrag #3 open_in_new) und der offiziellen Dokumentation für Gradle Einstellungen zusammengesucht, welche ich an euch weiterleiten möchte.
Initial benötigt ihr die forms_rt.jar
aus dem JetBrains/IntelliJ IDEA Community Edition/IntelliJ IDEA Community Edition/lib
Ordner in eurem Projekt. Um dies zu erreichen und auch Updates automatisch mitnehmen zu können, habe ich einfach einen Symlink erstellt. Somit liegt die Datei nun ebenfalls in meinem Projekt im libs
Ordner. Ihr könnt die Datei aber natürlich auch einfach manuell in euer Projekt kopieren.
Zusätzlich sollte eure build.gradle
Datei konfiguriert werden.
plugins {
id 'java'
}
...
jar {
manifest {
attributes 'Main-Class': 'main.Main'
}
}
task fatJar(type: Jar) {
manifest.from jar.manifest
from {
configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
}
with jar
}
repositories {
flatDir dirs: "${rootDir}/libs"
...
}
dependencies {
compile name: 'forms_rt'
...
}
Hier habe ich einen generellen jar
Task und den eigentlichen fatJar
Task. Letzterer wird aktiv genutzt, um das Projekt zu bauen und die JAR zu erzeugen. Hierfür wird der manifest
Eintrag des jar
Tasks übernommen und alle nötigen Konfigurationen eingesammelt. Dadurch sind später alle Abhängigkeiten des Projekts in eurer JAR enthalten. Wichtig ist hier configurations.runtime
zu nutzen, da ansonsten Einträge fehlen können.
Da es leider keine aktuelle Version aus Repositories gibt, habe ich mittels flatDir dirs: "${rootDir}/libs"
und compile name: 'forms_rt'
die Forms Library manuell eingebunden. Definitiv unschön, aber derzeit wohl die einzige gangbare Lösung. Hier sollte IntelliJ meiner Meinung nach noch nachbessern.
Nachdem ihr nun die Library habt und prinzipiell auch die richtige Konfiguration des Build-Toolings, muss IDEA selbst noch eingestellt werden. Unter File | Settings | Editor | GUI Designer
muss Generate GUI into
auf Java source code
gestellt werden. Ich habe ebenfalls Automatically copy from runtime classes to the output directory
aktiviert.
Ebenfalls muss unter File | Settings | Build, Execution, Deployment | Build Tools | Gradle
sowohl Build and run using
, wie auch Run tests using
auf IntelliJ IDEA
gestellt werden. Sofern ihr eine der IntelliJ IDEA Einstellungen vergesst, kommt es entweder zu Build-Fehlern beim Bauen via IDEA / Gradle Task oder beim Start der Anwendung gibt es Probleme mit der generierten UI (fehlende Klassen, fehlende Code Updates).
Mit diesen Einstellungen kann ich sowohl aus IDEA heraus alles starten, wie auch über den Gradle Task die finale JAR bauen. Alles wird immer frisch erzeugt, sodass die jeweiligen Artifacts auch immer den aktuellen Stand des Programms widerspiegeln.