{"id":23256,"date":"2026-06-07T06:50:16","date_gmt":"2026-06-07T04:50:16","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=23256"},"modified":"2026-06-07T07:04:58","modified_gmt":"2026-06-07T05:04:58","slug":"automatisch-uml-generierung-plantuml-format-mit-archunit-und-externe-abhaengigkeiten","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=23256","title":{"rendered":"Automatisch UML Generierung (plantUML-Format) mit ArchUnit und externe Abh\u00e4ngigkeiten"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2026\/06\/mammut-extern-scaled.jpeg\" alt=\"externe UML\" width=\"2560\" height=\"1012\"\/><\/p>\n<p>Wie <a href=\"http:\/\/blog.wenzlaff.de\/?p=23250\" target=\"_blank\">hier<\/a> beschrieben, hier noch eine Version mit externen Abh\u00e4ngigkeiten, dazu einfach den Filter entfernen.<\/p>\n<p>Dieser Java 21-Code ist eine Stream-Pipeline, die Abh\u00e4ngigkeiten zwischen Java-Paketen analysiert und sie als gerichtete Graphen-Kanten (in der Form \u2009&#8220;PaketA &#8211;> PaketB&#8220;\u2009) in einer \u2009Set<String>\u2009 sammelt. Er nutzt moderne Java-Features wie \u2009Stream\u2009, \u2009flatMap\u2009, \u2009filter\u2009, \u2009map\u2009 und \u2009Collectors\u2009.<!--more--><\/p>\n<pre class=\"lang:java decode:true \" >void exportDependencyGraphAsPlantUML() throws Exception {\r\n\r\n\tStringBuilder uml = new StringBuilder();\r\n\tuml.append(\"@startuml\\n\");\r\n\tuml.append(\"title Taxonomie Architektur (ArchUnit Export with extern Package)\\n\\n\");\r\n\r\n\t\/\/ =====================================================\r\n\t\/\/ Knoten (Pakete)\r\n\t\/\/ =====================================================\r\n\r\n\tuml.append(\"package model {}\\n\");\r\n\tuml.append(\"package service {}\\n\");\r\n\tuml.append(\"package data {}\\n\");\r\n\tuml.append(\"package arch {}\\n\\n\");\r\n\r\n\t\/\/ =====================================================\r\n\t\/\/ Abh\u00e4ngigkeiten extrahieren\r\n\t\/\/ =====================================================\r\n\r\n\tSet&lt;String&gt; edges = classes.stream().flatMap(c -&gt; c.getDirectDependenciesFromSelf().stream()).map(dep -&gt; {\r\n\t    String from = dep.getOriginClass().getPackageName();\r\n\t    String to = dep.getTargetClass().getPackageName();\r\n\t    return from + \" --&gt; \" + to;\r\n\t}).collect(Collectors.toSet());\r\n\r\n\t\/\/ =====================================================\r\n\t\/\/ Kanten schreiben\r\n\t\/\/ =====================================================\r\n\r\n\tfor (String edge : edges) {\r\n\r\n\t    String cleaned = edge.replace(\"de.wenzlaff.taxonomie.\", \"\").replace(\"..\", \"\");\r\n\r\n\t    uml.append(cleaned).append(\"\\n\");\r\n\t}\r\n\r\n\tuml.append(\"\\n@enduml\");\r\n\r\n\t\/\/ =====================================================\r\n\t\/\/ Datei schreiben\r\n\t\/\/ =====================================================\r\n\r\n\tPath output = Path.of(\"target\/taxonomy-architecture.puml\");\r\n\tFiles.createDirectories(output.getParent());\r\n\tFiles.writeString(output, uml.toString());\r\n    }<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Wie hier beschrieben, hier noch eine Version mit externen Abh\u00e4ngigkeiten, dazu einfach den Filter entfernen. Dieser Java 21-Code ist eine Stream-Pipeline, die Abh\u00e4ngigkeiten zwischen Java-Paketen analysiert und sie als gerichtete Graphen-Kanten (in der Form \u2009&#8220;PaketA &#8211;> PaketB&#8220;\u2009) in einer \u2009Set\u2009 sammelt. Er nutzt moderne Java-Features wie \u2009Stream\u2009, \u2009flatMap\u2009, \u2009filter\u2009, \u2009map\u2009 und \u2009Collectors\u2009.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[220,5,6180],"tags":[],"class_list":["post-23256","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java","category-java-21"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/23256","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=23256"}],"version-history":[{"count":4,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/23256\/revisions"}],"predecessor-version":[{"id":23264,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/23256\/revisions\/23264"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=23256"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=23256"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=23256"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}