{"id":14048,"date":"2020-02-04T05:11:56","date_gmt":"2020-02-04T04:11:56","guid":{"rendered":"http:\/\/blog.wenzlaff.de\/?p=14048"},"modified":"2020-02-03T16:25:44","modified_gmt":"2020-02-03T15:25:44","slug":"refactoring-eines-maven-plugins","status":"publish","type":"post","link":"http:\/\/blog.wenzlaff.de\/?p=14048","title":{"rendered":"Refactoring eines Maven-Plugins mit Dependency Injection"},"content":{"rendered":"<p>Das <a href=\"http:\/\/blog.wenzlaff.de\/?p=14029\" rel=\"noopener noreferrer\" target=\"_blank\">hier<\/a> erstellt Maven-Plugin, kann noch etwas refactored werden mit Nutzung von Dependency Injection.<\/p>\n<p><a href=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/02\/sonne-indien-1446x1536-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/02\/sonne-indien-1446x1536-1.jpg\" alt=\"\" width=\"1446\" height=\"1536\" class=\"aligncenter size-full wp-image-14049\" srcset=\"http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/02\/sonne-indien-1446x1536-1.jpg 1446w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/02\/sonne-indien-1446x1536-1-282x300.jpg 282w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/02\/sonne-indien-1446x1536-1-964x1024.jpg 964w, http:\/\/blog.wenzlaff.de\/wp-content\/uploads\/2020\/02\/sonne-indien-1446x1536-1-768x816.jpg 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a>Always rejoice, mit freundlicher Genehmigung <a href=\"http:\/\/katharina.wenzlaff.de\/\" rel=\"noopener noreferrer\" target=\"_blank\">meines Lieblingsk\u00fcnstlers<\/a><\/p>\n<p>Die Methode im Mojo kann in eine eigene Klasse <strong>CommandProviderApi<\/strong> verschoben werden. Ein neues Interface <strong>CommandProvider<\/strong> kann erstellt werden. Die erstellen wir hier:<\/p>\n<p>1. Das Interface:<!--more--><\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.command.maven.plugin;\r\n\r\nimport org.apache.maven.plugin.MojoExecutionException;\r\n\r\n\/**\r\n * \r\n * @author Thomas Wenzlaff\r\n *\r\n *\/\r\ninterface CommandProvider {\r\n\r\n\tString getCommand(String command) throws MojoExecutionException;\r\n}\r\n<\/pre>\n<p>2. Die Implementierung des Interface:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.command.maven.plugin;\r\n\r\nimport java.io.BufferedReader;\r\nimport java.io.IOException;\r\nimport java.io.InputStreamReader;\r\n\r\nimport javax.inject.Named;\r\nimport javax.inject.Singleton;\r\n\r\nimport org.apache.maven.plugin.MojoExecutionException;\r\n\r\n\/**\r\n * \r\n * @author Thomas Wenzlaff\r\n *\r\n *\/\r\n@Named\r\n@Singleton\r\npublic class CommandProviderApi implements CommandProvider {\r\n\r\n\t@Override\r\n\tpublic String getCommand(String command) throws MojoExecutionException {\r\n\r\n\t\tString s = null;\r\n\t\tStringBuilder buffer = new StringBuilder(\"\\n\");\r\n\r\n\t\ttry {\r\n\t\t\tProcess p = Runtime.getRuntime().exec(command);\r\n\r\n\t\t\ttry (BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()))) {\r\n\r\n\t\t\t\twhile ((s = stdInput.readLine()) != null) {\r\n\t\t\t\t\tbuffer.append(s);\r\n\t\t\t\t\tbuffer.append(\"\\n\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\ttry (BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()))) {\r\n\r\n\t\t\t\twhile ((s = stdError.readLine()) != null) {\r\n\t\t\t\t\tbuffer.append(\"Error: \" + s);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (IOException e) {\r\n\t\t\tthrow new MojoExecutionException(\"Fehler beim ausf\u00fchren des Kommandos: '\" + command, e);\r\n\t\t}\r\n\r\n\t\treturn buffer.toString();\r\n\t}\r\n}\r\n<\/pre>\n<p>Wichtig sind die beiden neuen Annotationen @Named und @Singleton an der Klasse.<\/p>\n<p>3. Die Methode im CommandMojo l\u00f6schen und die Klasse Injecten:<\/p>\n<p><strong>@Inject<br \/>\nprivate CommandProvider commandProvider;<\/strong><\/p>\n<p>Und verwenden:<\/p>\n<p><strong>String commandoErgebnis = commandProvider.getCommand(command);<\/strong><\/p>\n<p>Die ganze Klasse sieht dann so aus:<\/p>\n<pre class=\"lang:java decode:true \" >package de.wenzlaff.command.maven.plugin;\r\n\r\nimport javax.inject.Inject;\r\n\r\nimport org.apache.maven.plugin.AbstractMojo;\r\nimport org.apache.maven.plugin.MojoExecutionException;\r\nimport org.apache.maven.plugin.MojoFailureException;\r\nimport org.apache.maven.plugins.annotations.LifecyclePhase;\r\nimport org.apache.maven.plugins.annotations.Mojo;\r\nimport org.apache.maven.plugins.annotations.Parameter;\r\nimport org.apache.maven.project.MavenProject;\r\n\r\n\/**\r\n * Ein Kommando-Mojo.\r\n * \r\n * @author Thomas Wenzlaff\r\n *\r\n *\/\r\n@Mojo(name = \"info\", defaultPhase = LifecyclePhase.INITIALIZE)\r\npublic class CommandMojo extends AbstractMojo {\r\n\r\n\t@Inject\r\n\tprivate CommandProvider commandProvider;\r\n\r\n\t\/**\r\n\t * Der command Parameter. Wenn er nicht angegeben wird, wird default: ls -la\r\n\t * verwendet.\r\n\t * \r\n\t * Es kann aber auch noch ein Verzeichnis \u00fcbergeben werden, das \u00fcberwacht werden\r\n\t * soll. Z.B.\r\n\t * \r\n\t * mvn de.wenzlaff.dir.maven.plugin:de.wenzlaff.command.maven.plugin:info\r\n\t * -Dcommand=\"ls -la \/Users\/thomaswenzlaff\"\r\n\t * \r\n\t *\/\r\n\t@Parameter(property = \"command\", defaultValue = \"ls -la\")\r\n\tprivate String command;\r\n\r\n\t@Parameter(property = \"project\", readonly = true)\r\n\tprivate MavenProject project;\r\n\r\n\t@Override\r\n\tpublic void execute() throws MojoExecutionException, MojoFailureException {\r\n\r\n\t\t\/\/ mvn ${groupId}:${artifactId}:${goal}\r\n\t\t\/\/ mvn de.wenzlaff.command.maven.plugin:de.wenzlaff.command.maven.plugin:info\r\n\r\n\t\tgetLog().info(\"Thomas sein Command-Plugin in Version: \" + project.getVersion() + \", ArtifactId: \" + project.getArtifactId());\r\n\t\tgetLog().info(\"F\u00fchre das Kommando aus: \" + command);\r\n\r\n\t\tString commandoErgebnis = commandProvider.getCommand(command);\r\n\r\n\t\tgetLog().info(commandoErgebnis);\r\n\t}\r\n}\r\n<\/pre>\n<p>Super sie enth\u00e4lt nur noch das Plugin.<\/p>\n<p>4. Test<\/p>\n<p><strong>de.wenzlaff.command.maven.plugin % mvn de.wenzlaff.command.maven.plugin:de.wenzlaff.command.maven.plugin:info -Dcommand=&#8220;ls&#8220;<\/strong><\/p>\n<p>Ok, funktioniert so wie vorher.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das hier erstellt Maven-Plugin, kann noch etwas refactored werden mit Nutzung von Dependency Injection. Always rejoice, mit freundlicher Genehmigung meines Lieblingsk\u00fcnstlers Die Methode im Mojo kann in eine eigene Klasse CommandProviderApi verschoben werden. Ein neues Interface CommandProvider kann erstellt werden. Die erstellen wir hier: 1. Das Interface:<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[220,5,3163,79],"tags":[3902,3901,2178,66,3898,293,172,322],"class_list":["post-14048","post","type-post","status-publish","format-standard","hentry","category-anleitung","category-java","category-maven","category-programmierung","tag-dependency-injection","tag-interface","tag-java","tag-maven","tag-maven-plugin","tag-plugin","tag-refactor","tag-verzeichnis"],"_links":{"self":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/14048","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=14048"}],"version-history":[{"count":0,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=\/wp\/v2\/posts\/14048\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=14048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=14048"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.wenzlaff.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=14048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}