PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come utilizzare il componente Java Embedded PostgreSQL Server come servizio separato?

Il problema principale qui è essere in grado di condividere uno stato tra due diversi obiettivi di un plug-in:un start obiettivo che avvierebbe un processo e quindi un stop obiettivo che lo ucciderebbe. Un buon modo per farlo è utilizzare ContextEnabled interfaccia implementata da tutti i mojo. Fornisce un getPluginContext() metodo che restituisce una mappa (grezza), in cui puoi memorizzare oggetti da condividere tra mojo.

Con questo approccio, puoi memorizzare qualcosa che hai creato in start obiettivo di un plug-in e recuperarlo in stop obiettivo. Ecco un esempio minimalista per mostrarlo in azione, in cui un semplice valore String è condiviso tra i mojo.

Imposta un progetto di plug-in Maven . Ciò si riduce fondamentalmente ad avere un progetto con il seguente POM, che è il POM standard per un plug-in Maven, utilizzando Java 8 e annotazioni per la configurazione:

<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>

Nota la confezione di tipo maven-plugin che dichiara a Maven che si tratta di un progetto di plugin. In questo nuovo progetto, considera il seguente 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"));
    }

}

Questo sta dichiarando un nuovo start mojo che è vincolato per impostazione predefinita a pre-integration-test fase. Recupera il contesto del plugin e vi inserisce un nuovo oggetto. In quanto sopra, è un semplice POJO personalizzato chiamato MyService che assume un valore nel suo costruttore. Questo oggetto è mappato su una chiave di "myService" , che funge da ricerca.

Quindi, possiamo avere:

@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());
    }

}

Questo sta dichiarando un nuovo stop mojo che è vincolato per impostazione predefinita a post-integration-test fase. Recupera il contesto del plugin, estrae l'oggetto sotto la chiave "myService" , e infine ottieni il suo valore e lo registra.

Dopo aver impacchettato e installato questo plugin Maven (con mvn clean install ) nel tuo repository locale, puoi utilizzarlo in un progetto di esempio con

<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>

Se esegui mvn clean verify su quel progetto di esempio, finirai per avere "foo" stampato nei tuoi log, nel post-integration-test fase. Questo mostra che il valore è stato impostato correttamente da start mojo, e poi correttamente recuperato da stop mojo.

Ovviamente puoi memorizzare oggetti complessi in questa mappa, non solo una String (per il quale potrebbero esserci soluzioni più semplici). In particolare, potrebbe essere un host per il tuo process istanza che si desidera interrompere. Puoi sbarazzarti del exec-maven-plugin , crea un nuovo plugin Maven contenente il codice che ti serve già per configurare il database incorporato in un start obiettivo, archiviare l'istanza del processo nel contesto del plug-in in questo obiettivo e infine interrompere questo processo in un secondo momento in un altro stop mojo recuperandolo dal contesto del plugin.