Das hier erstellt Maven-Plugin, kann noch etwas refactored werden mit Nutzung von Dependency Injection.
Always rejoice, mit freundlicher Genehmigung meines Lieblingskünstlers
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package de.wenzlaff.command.maven.plugin; import org.apache.maven.plugin.MojoExecutionException; /** * * @author Thomas Wenzlaff * */ interface CommandProvider { String getCommand(String command) throws MojoExecutionException; } |
2. Die Implementierung des Interface:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
package de.wenzlaff.command.maven.plugin; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javax.inject.Named; import javax.inject.Singleton; import org.apache.maven.plugin.MojoExecutionException; /** * * @author Thomas Wenzlaff * */ @Named @Singleton public class CommandProviderApi implements CommandProvider { @Override public String getCommand(String command) throws MojoExecutionException { String s = null; StringBuilder buffer = new StringBuilder("\n"); try { Process p = Runtime.getRuntime().exec(command); try (BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()))) { while ((s = stdInput.readLine()) != null) { buffer.append(s); buffer.append("\n"); } } try (BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()))) { while ((s = stdError.readLine()) != null) { buffer.append("Error: " + s); } } } catch (IOException e) { throw new MojoExecutionException("Fehler beim ausführen des Kommandos: '" + command, e); } return buffer.toString(); } } |
Wichtig sind die beiden neuen Annotationen @Named und @Singleton an der Klasse.
3. Die Methode im CommandMojo löschen und die Klasse Injecten:
@Inject
private CommandProvider commandProvider;
Und verwenden:
String commandoErgebnis = commandProvider.getCommand(command);
Die ganze Klasse sieht dann so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
package de.wenzlaff.command.maven.plugin; import javax.inject.Inject; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; /** * Ein Kommando-Mojo. * * @author Thomas Wenzlaff * */ @Mojo(name = "info", defaultPhase = LifecyclePhase.INITIALIZE) public class CommandMojo extends AbstractMojo { @Inject private CommandProvider commandProvider; /** * Der command Parameter. Wenn er nicht angegeben wird, wird default: ls -la * verwendet. * * Es kann aber auch noch ein Verzeichnis übergeben werden, das überwacht werden * soll. Z.B. * * mvn de.wenzlaff.dir.maven.plugin:de.wenzlaff.command.maven.plugin:info * -Dcommand="ls -la /Users/thomaswenzlaff" * */ @Parameter(property = "command", defaultValue = "ls -la") private String command; @Parameter(property = "project", readonly = true) private MavenProject project; @Override public void execute() throws MojoExecutionException, MojoFailureException { // mvn ${groupId}:${artifactId}:${goal} // mvn de.wenzlaff.command.maven.plugin:de.wenzlaff.command.maven.plugin:info getLog().info("Thomas sein Command-Plugin in Version: " + project.getVersion() + ", ArtifactId: " + project.getArtifactId()); getLog().info("Führe das Kommando aus: " + command); String commandoErgebnis = commandProvider.getCommand(command); getLog().info(commandoErgebnis); } } |
Super sie enthält nur noch das Plugin.
4. Test
de.wenzlaff.command.maven.plugin % mvn de.wenzlaff.command.maven.plugin:de.wenzlaff.command.maven.plugin:info -Dcommand=“ls“
Ok, funktioniert so wie vorher.