2016-11-18 3 views
0

Ich habe versucht, herauszufinden, wie Sie eine eingebettete Datenbank über ein Profil ausführen und REST-Aufrufe über Postboten ausführen können. Das ist, was ich habe, so weit:Embedded H2-Datenbank mit mvn jetty ausgeführt: run

<profile> 
     <id>developRest</id> 
     <build> 
     <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>sql-maven-plugin</artifactId> 
      <version>1.5</version> 
      <dependencies> 
       <dependency> 
        <groupId>com.h2database</groupId> 
        <artifactId>h2</artifactId> 
        <version>${h2.version}</version> 
       </dependency> 
      </dependencies> 
      <configuration> 
       <driver>org.h2.Driver</driver> 
       <url>jdbc:h2:mem:test</url> 
       <username>sa</username> 
       <password>sa</password> 
      </configuration> 
      <executions> 
       <execution> 
        <id>my-execution</id> 
        <goals> 
         <goal>execute</goal> 
        </goals> 
        <configuration> 
         <autocommit>true</autocommit> 
         <srcFiles> 
          <srcFile>src/test/resources/table-ddl.sql</srcFile> 
          <srcFile>src/test/resources/insert-into-table.sql</srcFile> 
         </srcFiles> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
      <plugin> 
       <groupId>org.mortbay.jetty</groupId> 
       <artifactId>jetty-maven-plugin</artifactId> 
       <version>${jetty.version}</version> 
       <configuration> 
        <webApp> 
         <descriptor>src/main/webapp/WEB-INF/jetty.xml</descriptor> 
        </webApp> 
        <stopKey></stopKey> 
        <stopPort></stopPort> 
       </configuration> 
      </plugin> 
     </plugins> 
     </build> 
     <dependencies> 
      <dependency> 
       <groupId>com.h2database</groupId> 
       <artifactId>h2</artifactId> 
       <version>${h2.version}</version> 
      </dependency> 
     </dependencies> 
    </profile> 

Ich habe mit Phasen herumgespielt, aber nichts scheint wirklich zu bleiben. Wenn ich dies mit mvn SQL ausführen: execute @ my-Ausführung Anlegesteg: laufen, die Servlet läuft, aber wenn ich eine Pause-Methode aufrufen, erhalte ich

Failed to execute goal org.codehaus.mojo:sql-maven-plugin:1.5:execute (my-execution) on project myProject: The parameters 'driver', 'url' for goal org.codehaus.mojo:sql-maven-plugin:1.5:execute are missing or invalid Was mir fehlt, dass die Treiber und URL gültig sein werden? Danke für Ihre Hilfe.

Update: Gebrauchte mvn -PdevelopRest sql:[email protected] jetty:run werden von dem Treiber und URL Fehler beseitigen, aber immer noch stecken mit:

### Error querying database. Cause: org.h2.jdbc.JdbcSQLException: Table "myTable" not found; SQL statement: 

Wenn eine GET von Postbote aufrufen. Irgendwelche Gedanken?

Antwort

0

Ich finde es schwer zu glauben, dass Sie einen Maven-Fehler erhalten, wenn Sie eine REST-Methode aufrufen (Failed to execute goal ...).

Abgesehen davon, ich denke, Ihr echtes Problem ist dies: Sie verwenden H2 als In-Memory-Datenbank, das heißt, es ist verfügbar, solange Ihre Anwendung ausgeführt wird. Wenn Ihre Anwendung gelöscht wird, geht Ihre Datenbank verloren.

Im Kontext von Maven, wo Sie mehrere Plugins ausführen, überlebt die Datenbank nicht die Ausführung eines einzelnen Plugins. Ihre my-execution instanziiert eine In-Memory-Datenbank, die dann verschwindet. Die jetty-maven-plugin erstellt eine eigene In-Memory-Datenbank, die dann keine der DDL/SQL hat, die in die vorherige ging.

Wahrscheinlich gibt es eine Reihe von Möglichkeiten, dies zu beheben, wie diese:

  1. eine In-Memory-Datenbank nicht, verwendet lieber H2-Dateien schreiben, z.B. jdbc:h2:/data/test, oder, da Sie Maven verwenden: jdbc:h2:${project.build.directory}/data/test
  2. Initialisieren Sie die Datenbank nicht mit der sql-maven-plugin, sondern direkt in der Anwendung. Sie könnten das tun:

    1. Mit einigen benutzerdefinierten Code, dass Sie nur
    2. auf dem Test Classpath setzen die DDL/SQL an die Verbindungszeichenfolge der Anwendung („Execute SQL on Connection“) Durch das Hinzufügen, etwa so:

      jdbc:h2:mem:test;INIT=runscript from '~/table-ddl.sql'\\;runscript from '~/insert-into-table.sql'"; 
      

H2 ist eine wunderbare Datenbank. Viel Glück!

+0

Ich habe am Ende keine In-Memory-Datenbank verwendet. Ich hatte wirklich gehofft, ich könnte (weil es so bequem ist!). Aber du hast recht, dass es nicht weitergeht, von dem ich hoffte, dass ich es herausfinden könnte. Danke für deinen Rat. Der Maven-Fehler tritt auf, wenn versucht wird, beim Rest-Aufruf eine Verbindung zur Datenbank herzustellen. Aber seit ich den H2-Server benutze und mich mit dem H2-Server verbinde, bekomme ich diesen Fehler nicht mehr, da die db weiter besteht. Danke noch einmal! – Kevin