{"id":13729,"date":"2019-10-18T20:00:58","date_gmt":"2019-10-18T18:00:58","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=13729"},"modified":"2019-10-19T18:33:29","modified_gmt":"2019-10-19T16:33:29","slug":"in-unter-5-minuten-auf-einem-raspberry-pi-zero-eine-java-quarkus-rest-anwendung-mit-junit-test-neu-erstellen-und-starten","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=13729","title":{"rendered":"In unter 5 Minuten auf einem Raspberry Pi Zero eine Java Quarkus REST Anwendung mit JUnit-Test neu erstellen und starten!"},"content":{"rendered":"<p>Wenn Java 8 und ein <a href=\"http:\/\/blog.wenzlaff.de\/?p=13726\" rel=\"noopener noreferrer\" target=\"_blank\">aktuelles Maven<\/a> auf dem Raspberry Pi installiert ist, kann man in <strong>unter 5 Minuten<\/strong> eine komplette REST-Anwendung mit statischer Webseite erstellen und starten. Die dann sogar Hot Reloading f\u00e4hig ist. Das geht in drei Schritten und das sogar auf einem Raspberry Pi Zero:<br \/>\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><br \/>\n1. Ein neues leeres Verzeichnis erstellen und dahin wechseln:<\/p>\n<pre class=\"lang:default decode:true \" >\r\nmkdir quarkus-anwendung\r\ncd quarkus-anwendung<\/pre>\n<p>2. Mit folgenden Maven Kommando ein Maven Projekt in ca. 30 Sekunden erstellen<\/p>\n<pre class=\"lang:default decode:true \" >mvn io.quarkus:quarkus-maven-plugin:0.24.0:create     -DprojectGroupId=de.wenzlaff.info     -DprojectArtifactId=info-kleinhirn     -DclassName=\"de.wenzlaff.InfoResource\"     -Dpath=\"\/info\"\r\n<\/pre>\n<p>3. Das Projekt compilieren und starten in ca. 40 Sekunden mit:<\/p>\n<pre class=\"lang:default decode:true \" >mvn compile quarkus:dev<\/pre>\n<p>Wenn der Server gestartet ist kann im Browser das Servlet aufgerufen werden mit:<\/p>\n<p><strong>http:\/\/[PI-ADRESSE]:8080\/info<\/strong><\/p>\n<p>Ergebnis: hello<\/p>\n<p>4. Nun wollen wir in einem anderen Kommondozeilen-Fenster in das Verzeichnis<!--more--><\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\ncd ~\/quarkus-anwendung\/src\/main\/java\/de\/wenzlaff\r\n\r\nvi InfoResource.java\r\n<\/pre>\n<p>gehen und in einem Editor die Java Klasse <strong>InfoResource.java<\/strong> ver\u00e4ndern. Wir ersetzen das <em>hello<\/em> durch: <em>Hallo Kleinhirn.eu<\/em> und speichern die Datei ab.<\/p>\n<pre class=\"lang:java decode:true \" >\r\n\r\npackage de.wenzlaff;\r\n\r\nimport javax.ws.rs.GET;\r\nimport javax.ws.rs.Path;\r\nimport javax.ws.rs.Produces;\r\nimport javax.ws.rs.core.MediaType;\r\n\r\n@Path(\"\/info\")\r\npublic class InfoResource {\r\n\r\n    @GET\r\n    @Produces(MediaType.TEXT_PLAIN)\r\n    public String hello() {\r\n        return \"Hallo Kleinhirn.eu\";\r\n    }\r\n}<\/pre>\n<p>Nun k\u00f6nnen wir die Webseite aktualisieren und wir sehen den neu compilierten Code: Hallo Kleinhirn.eu. Wir k\u00f6nnen auch die statische Testseite aufrufen mit <\/p>\n<p><strong>http:\/\/[PI-ADRESSE]:8080<\/strong><\/p>\n<p>Auch ein JUnit Test wurde automatisch erstellt. Der muss nat\u00fcrlich jetzt angepasst werden, da er sonst nach der \u00c4nderung fehlschl\u00e4gt.<\/p>\n<pre class=\"lang:default decode:true \" >[INFO]\r\n[INFO] Results:\r\n[INFO]\r\n[ERROR] Failures:\r\n[ERROR]   InfoResourceTest.testHelloEndpoint:18 1 expectation failed.\r\nResponse body doesn't match expectation.\r\nExpected: is \"hello\"\r\n  Actual: Hallo Kleinhirn.eu\r\n\r\n[INFO]\r\n[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0\r\n[INFO]\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] BUILD FAILURE<\/pre>\n<p>Also nach<strong> ~\/quarkus-anwendung\/src\/test\/java\/de\/wenzlaff<\/strong> gehen und die InfoResourceTest.java Klasse anpassen und speichern, schon l\u00e4uft es wieder mit einem <strong>mvn test<\/strong>:<\/p>\n<pre class=\"lang:default decode:true \" >INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 65.462 s - in de.wenzlaff.InfoResourceTest\r\nINFO  [io.quarkus] (main) Quarkus stopped in 0.968s\r\n[INFO]\r\n[INFO] Results:\r\n[INFO]\r\n[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0\r\n[INFO]\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] BUILD SUCCESS\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] Total time:  02:15 min<\/pre>\n<p>Und auch ein Package kann man leicht erstellen um die Anwendung zu verteilen und starten. Das geht mit dem Maven Befehlt:<\/p>\n<p><strong>.\/mvnw clean package<\/strong><\/p>\n<p>Und schon hat man im <strong>target<\/strong> Verzeichnis ein startbares JAR und das auf einem Raspberry Pi Zero:<\/p>\n<pre class=\"lang:default decode:true \" >\r\nINFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 28914ms\r\n[INFO] [io.quarkus.creator.phase.runnerjar.RunnerJarPhase] Building jar: \/home\/pi\/quarkus-anwendung\/target\/info-kleinhirn-1.0-SNAPSHOT-runner.jar\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] BUILD SUCCESS\r\n[INFO] ------------------------------------------------------------------------\r\n[INFO] Total time:  03:21 min<\/pre>\n<p>Das kann man dann auch leicht starten, im target Verzeichnis:<br \/>\n<strong><br \/>\njava -jar info-kleinhirn-1.0-SNAPSHOT-runner.jar<\/strong><\/p>\n<p>Das starten l\u00e4uft dann in 20 Sekunden:<\/p>\n<pre class=\"lang:default decode:true \" >\r\n\r\npi@pi-zero:~\/quarkus-anwendung\/target $ java -jar info-kleinhirn-1.0-SNAPSHOT-runner.jar\r\nWARN  [io.qua.net.run.NettyRecorder] (Thread-1) Localhost lookup took more than one second, you need to add a \/etc\/hosts entry to improve Quarkus startup time. See https:\/\/thoeni.io\/post\/macos-sierra-java\/ for details.\r\nINFO  [io.quarkus] (main) info-kleinhirn 1.0-SNAPSHOT (running on Quarkus 0.24.0) started in 18.736s. Listening on: http:\/\/0.0.0.0:8080\r\nINFO  [io.quarkus] (main) Profile prod activated.\r\nINFO  [io.quarkus] (main) Installed features: [cdi, resteasy]\r\n<\/pre>\n<p>Wenn das nicht cool ist. Weitere Infos auf der <a href=\"https:\/\/quarkus.io\/get-started\/\" rel=\"noopener noreferrer\" target=\"_blank\">Quarkus Seite<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Java 8 und ein aktuelles Maven auf dem Raspberry Pi installiert ist, kann man in unter 5 Minuten eine komplette REST-Anwendung mit statischer Webseite erstellen und starten. Die dann sogar Hot Reloading f\u00e4hig ist. Das geht in drei Schritten und das sogar auf einem Raspberry Pi Zero: 1. Ein neues leeres Verzeichnis erstellen und &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/blog.wenzlaff.de\/?p=13729\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eIn unter 5 Minuten auf einem Raspberry Pi Zero eine Java Quarkus REST Anwendung mit JUnit-Test neu erstellen und starten!\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,2791,5,3163,3769,1023,2752],"tags":[3765,2178,2954,66,3764,2487,3766,194],"class_list":["post-13729","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-docker","category-java","category-maven","category-quarkus-framework","category-raspberry-pi","category-raspberry-pi-zero-w","tag-anwendung-rest","tag-java","tag-junit-test","tag-maven","tag-quarkus","tag-rest","tag-rest-anwendung","tag-test-2"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/13729","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=13729"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/13729\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=13729"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=13729"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=13729"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}