{"id":21123,"date":"2023-11-19T02:05:11","date_gmt":"2023-11-19T01:05:11","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=21123"},"modified":"2024-04-26T18:11:55","modified_gmt":"2024-04-26T16:11:55","slug":"quarkus-rest-service-mit-swagger-ui-in-unter-10-minuten-von-0-auf-dem-raspberry-pi-4-installieren","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=21123","title":{"rendered":"Quarkus REST-Service mit Swagger-UI in unter 10 Minuten von 0 auf dem Raspberry Pi 4 installieren (Bonus: Panache)"},"content":{"rendered":"<p>Einen aktuellen Quarkus REST-Service mit Swagger-UI kann in unter 10 Minuten auf dem Raspberry Pi 4 installiert werden. Das l\u00e4ngste daran ist noch der erstmalig download. Vor <a href=\"http:\/\/blog.wenzlaff.de\/?p=15541\" rel=\"noopener\" target=\"_blank\">3 Jahren<\/a> hatte ich das ja schon in 15 Minuten gemacht.<\/p>\n<p>Also diese 7. Schritte sind auf der Kommandozeile n\u00f6tig, um einen Aktuellen REST-Server mit Quarkus 3.5.3 zu starten:<\/p>\n<figure id=\"attachment_13737\" aria-describedby=\"caption-attachment-13737\" style=\"width: 5500px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/10\/Quarks-rest-Java.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/10\/Quarks-rest-Java.png\" alt=\"\" width=\"5500\" height=\"4000\" class=\"size-full wp-image-13737\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/10\/Quarks-rest-Java.png 5500w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/10\/Quarks-rest-Java-300x218.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/10\/Quarks-rest-Java-768x559.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2019\/10\/Quarks-rest-Java-1024x745.png 1024w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><figcaption id=\"caption-attachment-13737\" class=\"wp-caption-text\">Freut euch immer<\/figcaption><\/figure>\n<p><!--more--><\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\ncurl -Ls https:\/\/sh.jbang.dev | bash -s - trust add https:\/\/repo1.maven.org\/maven2\/io\/quarkus\/quarkus-cli\/\r\ncurl -Ls https:\/\/sh.jbang.dev | bash -s - app install --fresh --force quarkus@quarkusio\r\n\r\n# Kommandfenster schlie\u00dfen und neue Session er\u00f6ffnen\r\nquarkus create\r\n\r\n# in das Verzeichnis wechseln\r\ncd code-with-quarkus\r\n\r\n# Swagger und Openapi erg\u00e4nzen\r\nquarkus ext add io.quarkus:quarkus-swagger-ui\r\nquarkus ext add io.quarkus:quarkus-smallrye-openapi\r\n\r\n# Server im dev Modus starten\r\nquarkus dev\r\n\r\n<\/pre>\n<p>Schon k\u00f6nnen wir im Browser mit der URL <strong>http:\/\/localhost:8080\/q\/swagger-ui<\/strong> den Service aufrufen:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/swagger-ui-quarkus.png\" alt=\"\" width=\"2112\" height=\"1790\" class=\"aligncenter size-full wp-image-21124\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/swagger-ui-quarkus.png 2112w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/swagger-ui-quarkus-300x254.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/swagger-ui-quarkus-1024x868.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/swagger-ui-quarkus-768x651.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/swagger-ui-quarkus-1536x1302.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/swagger-ui-quarkus-2048x1736.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p>Oder auch von der Komandozeile:<\/p>\n<pre class=\"lang:default decode:true \" >\r\ncurl -X 'GET'   'http:\/\/localhost:8080\/hello'   -H 'accept: text\/plain'\r\n<\/pre>\n<p>Ein wiederholtes starten, geht dann aber auch schon in 85 Sekunden:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/quarkus.png\" alt=\"\" width=\"4164\" height=\"2060\" class=\"aligncenter size-full wp-image-21129\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/quarkus.png 4164w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/quarkus-300x148.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/quarkus-1024x507.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/quarkus-768x380.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/quarkus-1536x760.png 1536w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/quarkus-2048x1013.png 2048w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n<p><strong>Bonus: Git upload nach GitLabund Panache Integration<\/strong><\/p>\n<p>Dann kann das ganze auch nach GitLab \u00fcbertragen werden, dazu auf GitLab ein leeres (ohne Readme) Repo anlegen und <\/p>\n<pre class=\"lang:default decode:true \" >\r\n# im erzeugten Verzeichnis ein \r\ngit init\r\ngit add .\r\ngit commit -m \"Kommentar\"\r\n\r\n# das GitLab Repo erg\u00e4nzen, mit der https URL z.b\r\ngit remote add origin https:\/\/gitlab.com\/IT-Berater\/twrestflug.git\r\n\r\n# oder wenn ein anderes gesetzt ist ein update\r\ngit remote set-url origin https:\/\/gitlab.com\/IT-Berater\/twrestflug.git\r\n\r\n# dann \u00fcbertragen mit\r\ngit push -u origin master\r\n<\/pre>\n<p>In diesem <a href=\"https:\/\/gitlab.com\/IT-Berater\/twrestflug\" rel=\"noopener\" target=\"_blank\">TWRestFlug<\/a> Repo, gibt es dann auch noch ein leicht angepasste Version mit <a href=\"https:\/\/quarkus.io\/guides\/hibernate-reactive-panache\" rel=\"noopener\" target=\"_blank\">Panache<\/a>. Es brauch dazu eigentlich nur die zwei Dateien, und in der pom.xml Panache erg\u00e4nzen.<\/p>\n<p>Das BE das mit @Entity annotiert und von PanacheEntity abgeleitet wird:<\/p>\n<pre class=\"lang:java decode:true \" >\r\nimport io.quarkus.hibernate.orm.panache.PanacheEntity;\r\nimport jakarta.persistence.Entity;\r\n\r\n@Entity\r\npublic class Flugzeug extends PanacheEntity {\r\n\r\n\tprivate String name;\r\n\r\n\tprivate String kennung;\r\n\r\n\tpublic Flugzeug() {\r\n\r\n\t}\r\n\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\r\n\tpublic void setName(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\r\n\tpublic String getKennung() {\r\n\t\treturn kennung;\r\n\t}\r\n\r\n\tpublic void setKennung(String kennung) {\r\n\t\tthis.kennung = kennung;\r\n\t}\r\n\r\n}\r\n\r\nUnd eine Interface, das extends PanacheEntityResource erweitert:\r\n\r\n<\/pre>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.twflugzeuge;\r\n\r\nimport org.eclipse.microprofile.openapi.annotations.OpenAPIDefinition;\r\nimport org.eclipse.microprofile.openapi.annotations.info.Contact;\r\nimport org.eclipse.microprofile.openapi.annotations.info.Info;\r\n\r\nimport io.quarkus.hibernate.orm.rest.data.panache.PanacheEntityResource;\r\nimport io.quarkus.rest.data.panache.ResourceProperties;\r\n\r\n\/**\r\n * https:\/\/quarkus.io\/guides\/rest-data-panache\r\n *\/\r\n@OpenAPIDefinition(info = @Info(title = \"Flugzeug API\", version = \"1.0.0\", description = \"Flugzeug Client\", contact = @Contact(url = \"http:\/\/www.wenzlaff.info\", name = \"Thomas Wenzlaff\", email = \"info@wenzlaff.info\")))\r\n@ResourceProperties(path = \"v1\/flugzeug\")\r\npublic interface FlugzeugResource extends PanacheEntityResource&lt;Flugzeug, Long&gt; {\r\n\r\n}<\/pre>\n<p>Schon hat man eine <a href=\"https:\/\/quarkus.io\/guides\/hibernate-reactive-panache\" rel=\"noopener\" target=\"_blank\">REST-CRUD Anwendung mit Panache<\/a> mit speichern, l\u00f6schen und anzeigen&#8230;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/panache.png\" alt=\"\" width=\"1624\" height=\"1566\" class=\"aligncenter size-full wp-image-21135\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/panache.png 1624w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/panache-300x289.png 300w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/panache-1024x987.png 1024w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/panache-768x741.png 768w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2023\/11\/panache-1536x1481.png 1536w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einen aktuellen Quarkus REST-Service mit Swagger-UI kann in unter 10 Minuten auf dem Raspberry Pi 4 installiert werden. Das l\u00e4ngste daran ist noch der erstmalig download. Vor 3 Jahren hatte ich das ja schon in 15 Minuten gemacht. Also diese 7. Schritte sind auf der Kommandozeile n\u00f6tig, um einen Aktuellen REST-Server mit Quarkus 3.5.3 zu &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=21123\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eQuarkus REST-Service mit Swagger-UI in unter 10 Minuten von 0 auf dem Raspberry Pi 4 installieren (Bonus: Panache)\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,4176,5,79,3769,1023,4129,7],"tags":[5869,325,5868,3425,5867,5866,5089,1025,1264,3764,2672,2487,3767,3768],"class_list":["post-21123","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-git","category-java","category-programmierung","category-quarkus-framework","category-raspberry-pi","category-raspberry-pi-4-b","category-tools","tag-crud","tag-git","tag-git-init","tag-gitlab","tag-init","tag-leeres-repo","tag-panache","tag-pi","tag-push","tag-quarkus","tag-repo","tag-rest","tag-swagger","tag-swagger-ui"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/21123","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=21123"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/21123\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=21123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=21123"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=21123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}