PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie verwende ich die Embedded PostgreSQL Server Java-Komponente als separaten Dienst?

Das Kernproblem hier ist, einen Zustand zwischen zwei verschiedenen Zielen eines Plugins teilen zu können:einem start Ziel, das einen Prozess starten würde, und dann ein stop Ziel, das es töten würde. Eine gute Möglichkeit, dies zu tun, ist die Verwendung des ContextEnabled Schnittstelle, die alle mojos implementieren. Es bietet einen getPluginContext() Methode, die eine (rohe) Karte zurückgibt, in der Sie Objekte speichern können, die von Mojos geteilt werden sollen.

Mit diesem Ansatz können Sie etwas, das Sie erstellt haben, im start speichern Ziel eines Plugins, und bringe es zurück in den stop Tor. Hier ist ein minimalistisches Beispiel, um dies in Aktion zu zeigen, wo ein einfacher String-Wert von Mojos geteilt wird.

Ein Maven-Plugin-Projekt einrichten . Dies läuft im Grunde darauf hinaus, ein Projekt mit dem folgenden POM zu haben, das das Standard-POM für ein Maven-Plug-in ist, das Java 8 und Anmerkungen für die Konfiguration verwendet:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>sample.plugin</groupId>
  <artifactId>test-maven-plugin</artifactId>
  <version>1.0.0</version>
  <packaging>maven-plugin</packaging>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-plugin-plugin</artifactId>
        <version>3.5</version>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>3.3.9</version>
    </dependency>

    <!-- dependencies to annotations -->
    <dependency>
      <groupId>org.apache.maven.plugin-tools</groupId>
      <artifactId>maven-plugin-annotations</artifactId>
      <version>3.4</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>

Beachten Sie die Verpackung des Typs maven-plugin die Maven erklärt, dass dies ein Plugin-Projekt ist. Betrachten Sie in diesem neuen Projekt das folgende StartMojo :

@Mojo(name = "start", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST)
public class StartMojo extends AbstractMojo {

    @SuppressWarnings("unchecked")
    @Override
    public void execute() throws MojoExecutionException {
        getPluginContext().put("myService", new MyService("foo"));
    }

}

Dies deklariert einen neuen start mojo die standardmäßig an pre-integration-test Phase. Es ruft den Plugin-Kontext ab und fügt ein neues Objekt darin ein. Oben ist es ein einfaches benutzerdefiniertes POJO namens MyService die einen Wert in ihrem Konstruktor annimmt. Dieses Objekt wird einem Schlüssel von "myService" zugeordnet , die als Nachschlagewerk dient.

Dann können wir haben:

@Mojo(name = "stop", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST)
public class StopMojo extends AbstractMojo {

    @Override
    public void execute() throws MojoExecutionException {
        MyService service = (MyService) getPluginContext().get("myService");
        getLog().info(service.getValue());
    }

}

Dies erklärt einen neuen stop mojo, das standardmäßig an post-integration-test Phase. Es ruft den Plugin-Kontext ab, extrahiert das Objekt unter dem Schlüssel "myService" , und erhält schließlich seinen Wert und protokolliert ihn.

Nach dem Packen und Installieren dieses Maven-Plugins (mit mvn clean install ) in Ihr lokales Repo, können Sie es in einem Beispielprojekt mit verwenden

<plugin>
  <groupId>sample.plugin</groupId>
  <artifactId>test-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>sample</id>
      <goals>
        <goal>start</goal>
        <goal>stop</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Wenn Sie mvn clean verify ausführen Bei diesem Beispielprojekt erhalten Sie am Ende "foo" gedruckt in Ihren Protokollen, im post-integration-test Phase. Dies zeigt, dass der Wert vom start korrekt eingerichtet wurde mojo, und dann vom stop korrekt abgerufen mojo.

Natürlich können Sie in dieser Karte auch komplexe Objekte speichern, nicht nur einen String (für die es einfachere Lösungen geben könnte). Insbesondere könnte es ein Host für Ihren process sein Instanz, die Sie stoppen möchten. Sie können das exec-maven-plugin loswerden , erstellen Sie ein neues Maven-Plugin, das den Code enthält, den Sie bereits zum Einrichten der eingebetteten Datenbank in einem start benötigen Ziel, speichern Sie die Prozessinstanz im Plugin-Kontext in diesem Ziel und stoppen Sie diesen Prozess später in einem weiteren stop mojo durch Abrufen aus dem Plugin-Kontext.