Refactoring eines Maven-Plugins mit Dependency Injection

Das hier erstellt Maven-Plugin, kann noch etwas refactored werden mit Nutzung von Dependency Injection.

Refactoring eines Maven-Plugins mit Dependency InjectionAlways 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:

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:

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:

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.

Ähnliche Artikel:

  1. Ein eigenes Maven-Plugin in 15 Minuten inklusive Dokumentation erstellen
  2. Wie können auf einem Mac OS X dmg (Apple disk image) Archive mit Maven und hdiutil erstellt werden?
  3. Wie kann die aktuellste Maven Version 3.6.2 auf dem Raspberry Pi installiert werden?

wallpaper-1019588
Neuer Bundeskanzler Olaf Scholz
wallpaper-1019588
Blühende Kletterpflanzen, die winterhart sind und schnell wachsen
wallpaper-1019588
Raffles London at The OWO: Grossbritanniens einstiges Kriegsministerium wird Luxushotel
wallpaper-1019588
13 Immergrüne winterharte Sträucher für den optimalen Sichtschutz