enhancement
major
minor
defect
critical
major
minor
major
#30107
tl-maven-plugin: Schlägt das Erzeugen eines Layouts beim Bau einer Anwendung fehl, bleibt das Build grün
Fehler
Beim Bau einer Anwendung (Goal app des tl-maven-plugin, Packaging tl-app bzw. Parent tl-parent-app) führt LayoutCreator die Layout-Overlays aller Module zusammen und schreibt die fertigen Layouts in die Anwendung. Kann ein Layout nicht erzeugt werden (z.B. ein ungültiges Layout-XML, ein fehlendes Template oder ein unbekannter Parameter), wird der Fehler nur protokolliert, und das Build endet mit BUILD SUCCESS. Das Layout fehlt dann in der ausgelieferten Anwendung bzw. wird nicht vorab erzeugt, ohne dass das Build darauf hinweist. Da das ausgelieferte WAR die Overlays der Module in eine Datei zusammenfasst, lässt sich das Zusammenführen zur Laufzeit nicht mehr nachholen.
Ursache
- LayoutCreator.createLayout fängt jede Exception (auch aus log.checkErrors()) ab, protokolliert Creating layout failed: <layout> und liefert null; mergeLayout schreibt das Layout dann nicht.
- LayoutCreator.createLayoutsForTheme fängt die IOException von mergeLayout ab und protokolliert nur Merging of layout <layout> failed.
- Ebenso werden Fehler in startXMLProperties und startLayoutDependantModules nur protokolliert.
- LayoutStorage.readLayouts() protokolliert ein nicht lesbares Overlay nur; das Layout wird dann ohne dieses Overlay erzeugt.
Lösung
Das Erzeugen der Layouts ist ein Schritt, der einen Teil der Anwendung erzeugt, keine Prüfung: Schlägt er fehl, ist das gebaute WAR fehlerhaft, also schlägt das Build fehl (wie bei den View-Overlays, #30103). Ein Test, der alle Layouts erzeugt, ersetzt das nicht: Tests laufen standardmäßig nicht, Anwendungsprojekte haben einen solchen Test meist nicht, und er deckt Fehler des Build-Schritts selbst nicht ab.
- LayoutCreator.createLayouts meldet alle Fehler an ein gemeinsames Protocol: Layouts, die für ein Theme nicht erzeugt oder geschrieben werden können (mit Layout, Theme und Ursache), nicht lesbare Overlays (LayoutStorage.readLayouts(Protocol)), Fehler beim Laden der Konfiguration und beim Starten der benötigten Module sowie die View-Overlays aus #30103.
- Die übrigen Layouts werden weiter erzeugt, damit ein Lauf alle fehlerhaften Layouts nennt. Danach bricht checkErrors() ab; TLAppWar lässt das Build mit der eigentlichen Ursache (statt der InvocationTargetException) fehlschlagen, z.B.:
[ERROR] Failed to execute goal com.top-logic:tl-maven-plugin:8.0.0-SNAPSHOT:app (build-app) on project tl-demo: Cannot create app WAR: Could not create layouts for the application war: com.top_logic.basic.AbortExecutionException: Aborting due to previous errors: Creating layout 'test30107/broken.layout.xml' for theme 'coreSidebarCondensed' failed: No definition for test30107/noSuch.template.xml found. [ERROR] Creating layout 'test30107/broken.layout.xml' for theme 'coreCondensed' failed: No definition for test30107/noSuch.template.xml found. ...
- Die Anwendungen der Engine (tl-demo, tl-demo-react, tl-ai-demo, tl-demo-deploy, tl-doc-app, tl-factory-app, tl-kafka-demo, die Archetyp-Anwendungen) bauen weiterhin fehlerfrei; keines ihrer Layouts war bisher unbemerkt fehlerhaft.
- Test TestLayoutCreator: Ein Layout mit fehlendem Template und eines mit nicht wohlgeformtem Overlay werden mit Layout und Ursache gemeldet und nicht geschrieben, die gültigen Layouts werden geschrieben.