2011-12-06 11 views
7

TL; versione DR: Io voglio essere in grado di utilizzare il Maven Mojo SQL Plugin per creare/eliminare qualsiasi tavola nel mio schema DB (o caricare i dati di tali tabelle) a piacimento tramite la mvn riga di comando. Come?Gli errori che utilizzano Maven Mojo SQL: eseguire


Sono uno sviluppatore Java di lunga data, ma per la maggior parte ho vissuto in un mondo basata su ant. Mi piace la potenza e la chiarezza di ant e il controllo che mi dà su tutto. Tuttavia, nel mio nuovo lavoro, c'è una spinta per usare maven. Quindi ho deciso di impararlo usando un progetto a cui sto lavorando a casa.

Una delle cose che ho impostato su un diverso progetto personale è la possibilità di configurare e demolire completamente il mio database Postgres da ant sulla riga di comando. Riesco a tagliare ea dadi qualsiasi tabella, sequenza e dati di test di integrazione che mi piace, individualmente o in concerto. Certo, significa che ho un obiettivo di gajillion ant, ma funziona molto bene. Mi piace questo; mi è servito abbastanza bene nel corso degli anni.

Nella ricerca di come eseguire questa operazione in Maven durante il fine settimana, ho trovato il Mojo SQL Maven Plugin. Dopo aver esaminato il numero usage page (e uso questo termine in modo approssimativo, in quanto è davvero un singolo semi-esempio senza spiegazioni) e lo example page, sono stato in grado di apportare alcune modifiche al mio file pom.xml. Ho corretto alcuni errori di battitura evidenti nell'esempio (postgressql) e ho fatto riferimento allo PostgreSQL JDBC page per assicurarmi che la stringa di connessione JDBC fosse corretta. Io incollo tutto il pom.xml (modificato per proteggere il colpevole) di seguito:

<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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.mycompany.myapp</groupId> 
    <artifactId>myapp</artifactId> 
    <packaging>jar</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>myapp</name> 
    <url>http://maven.apache.org</url> 

    <repositories> 
     <repository> 
      <id>JBoss</id> 
      <url>https://repository.jboss.org/nexus/content/groups/public/</url> 
     </repository> 
    </repositories> 

    <dependencies> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.10</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-core</artifactId> 
      <version>4.0.0.CR7</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>sql-maven-plugin</artifactId> 
       <version>1.5</version> 

       <dependencies> 
        <dependency> 
         <groupId>postgresql</groupId> 
         <artifactId>postgresql</artifactId> 
         <version>8.3-606.jdbc4</version> 
        </dependency> 
       </dependencies> 

       <configuration> 
        <driver>org.postgresql.Driver</driver> 
        <url>jdbc:postgresql://localhost:5432/myapp</url> 
        <settingsKey>myapp</settingsKey> 
        <!--all executions are ignored if -Dmaven.test.skip=true--> 
        <skip>${maven.test.skip}</skip> 
       </configuration> 

       <executions> 
        <execution> 
         <id>drop-db-before-test-if-any</id> 
         <phase>process-test-resources</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <!-- need another database to drop the targeted one --> 
          <url>jdbc:postgresql://localhost:5432/template1</url> 
          <autocommit>true</autocommit> 
          <sqlCommand>drop database myapp</sqlCommand> 
          <!-- ignore error when database is not avaiable --> 
          <onError>continue</onError> 
         </configuration> 
        </execution> 

        <execution> 
         <id>create-db</id> 
         <phase>process-test-resources</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <url>jdbc:postgresql://localhost:5432/template1</url> 
          <!-- no transaction --> 
          <autocommit>true</autocommit> 
          <sqlCommand>create database myapp</sqlCommand> 
         </configuration> 
        </execution> 

        <execution> 
         <id>create-schema</id> 
         <phase>process-test-resources</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <autocommit>true</autocommit> 
          <srcFiles> 
           <srcFile>src/main/sql/create_person.sql</srcFile> 
          </srcFiles> 
         </configuration> 
        </execution> 

        <execution> 
         <id>create-data</id> 
         <phase>process-test-resources</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <orderFile>ascending</orderFile> 
          <fileset> 
           <basedir>${basedir}</basedir> 
           <includes> 
            <include>src/test/sql/person_data.sql</include> 
           </includes> 
          </fileset> 
         </configuration> 
        </execution> 

        <!-- drop db after test --> 
        <execution> 
         <id>drop-db-after-test</id> 
         <phase>test</phase> 
         <goals> 
          <goal>execute</goal> 
         </goals> 
         <configuration> 
          <url>jdbc:postgresql://localhost:5432/template1</url> 
          <autocommit>true</autocommit> 
          <sqlCommand>drop database myapp</sqlCommand> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

Ora, visto che non ho creato il database, non mostra in una \l sulla riga di comando PG :

[[email protected] myapp]$ psql template1 
Welcome to psql 8.3.5, the PostgreSQL interactive terminal. 

Type: \copyright for distribution terms 
     \h for help with SQL commands 
     \? for help with psql commands 
     \g or terminate with semicolon to execute query 
     \q to quit 

template1=# \l 
     List of databases 
    Name | Owner | Encoding 
-----------+----------+---------- 
postgres | postgres | UTF8 
template0 | postgres | UTF8 
template1 | postgres | UTF8 
(3 rows) 

Così, quando corro mvn sql:execute, mi aspetto il mio database per ottenere creato ... O almeno non a fallire sul compito drop-db-before-test-if-any dal momento che è destinata a continuare in caso di errore. Ma naturalmente:

[[email protected] myapp]$ mvn sql:execute 
[INFO] Scanning for projects... 
[INFO]                   
[INFO] ------------------------------------------------------------------------ 
[INFO] Building myapp 1.0-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[INFO] 
[INFO] --- sql-maven-plugin:1.5:execute (default-cli) @ myapp --- 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD FAILURE 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1.667s 
[INFO] Finished at: Mon Dec 05 20:22:17 CST 2011 
[INFO] Final Memory: 3M/81M 
[INFO] ------------------------------------------------------------------------ 
[ERROR] Failed to execute goal org.codehaus.mojo:sql-maven-plugin:1.5:execute (default-cli) on project myapp: FATAL: database "myapp" does not exist -> [Help 1] 
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. 
[ERROR] Re-run Maven using the -X switch to enable full debug logging. 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException 

La pagina di errore menzionato nell'ultima riga non c'è utile; mi dice solo che un plugin ha causato l'errore, non lo stesso Maven.

Quindi cerchiamo di eseguirlo con l'interruttore -X. Mi limiterò a postare la parte interessante dell'errore:

[ERROR] Failed to execute goal org.codehaus.mojo:sql-maven-plugin:1.5:execute (default-cli) on project myapp: FATAL: database "myapp" does not exist -> [Help 1] 
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:sql-maven-plugin:1.5:execute (default-cli) on project myapp: FATAL: database "myapp" does not exist 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:319) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 
Caused by: org.apache.maven.plugin.MojoExecutionException: FATAL: database "myapp" does not exist 
    at org.codehaus.mojo.sql.SqlExecMojo.execute(SqlExecMojo.java:618) 
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 
    ... 19 more 
Caused by: org.postgresql.util.PSQLException: FATAL: database "myapp" does not exist 
    at org.postgresql.core.v3.ConnectionFactoryImpl.readStartupMessages(ConnectionFactoryImpl.java:444) 
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:99) 
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:66) 
    at org.postgresql.jdbc2.AbstractJdbc2Connection.<init>(AbstractJdbc2Connection.java:124) 
    at org.postgresql.jdbc3.AbstractJdbc3Connection.<init>(AbstractJdbc3Connection.java:30) 
    at org.postgresql.jdbc4.AbstractJdbc4Connection.<init>(AbstractJdbc4Connection.java:29) 
    at org.postgresql.jdbc4.Jdbc4Connection.<init>(Jdbc4Connection.java:24) 
    at org.postgresql.Driver.makeConnection(Driver.java:386) 
    at org.postgresql.Driver.connect(Driver.java:260) 
    at org.codehaus.mojo.sql.SqlExecMojo.getConnection(SqlExecMojo.java:899) 
    at org.codehaus.mojo.sql.SqlExecMojo.execute(SqlExecMojo.java:612) 
    ... 21 more 

Ma, ma, ma ... <onError>continue</onError>!

Così, alle domande:

  1. Che cosa sto facendo di sbagliato? Sono le mie aspettative o il mio codice?
  2. Si noterà che ho un file create-person.sql. So dagli esempi che posso avere più file lì, come ad esempio create-address.sql. Ma in ant, ho la possibilità di creare la tabella address separatamente dalla tabella person, a condizione che esegua le attività di formica tenendo presente l'ordine dell'integrità referenziale. È qualcosa di simile possibile con maven? Se é cosi, come?

Ci scusiamo per la verbosità e grazie in anticipo per qualsiasi assistenza.

+0

Mi rendo conto che questo è un thread vecchio, ma potreste trovare questo plugin che ho iniziato a scrivere utile: https://github.com/adrianboimvaser/postgresql-maven-plugin. È ancora in una fase iniziale e manca di documentazione, ma per lo più funziona. Ho già rilasciato la versione 0.1 su Maven Central. Saluti! – adrianboimvaser

risposta

4

Failed to execute goal org.codehaus.mojo:sql-maven-plugin:1.5:execute (default-cli)

default-cli è la speciale executionId quando il plugin viene richiamato dalla riga di comando. Vedi this.

È stata associata l'esecuzione di tutti i plug-in sql alle fasi del ciclo di vita di Maven, ma si sta tentando di richiamare direttamente il plug-in.

mvn test dovrebbe funzionare.

Here è una discussione SO correlata.

+0

Beh, è ​​davvero spiacevole che Maven non mi permetta di agire come ho fatto in precedenza in Ant, ma grazie per l'informazione. – Mike

Problemi correlati