2011-12-06 16 views
7

TL; Wersja DR: Chcę móc używać Plugin SQL Maven Mojo do tworzenia/upuszczania dowolnej tabeli w moim schemacie DB (lub ładowania danych dla tych tabel) mvn wiersz polecenia. W jaki sposób?Błędy przy użyciu Maven Mojo sql: wykonaj


Jestem długi czas deweloper Java, ale w przeważającej części Żyłam w świecie opartym ant. Podoba mi się moc i jednoznaczność ant i kontrola, jaką daje mi nad wszystkim. Jednak w mojej nowej pracy jest push do użycia maven. Postanowiłem więc nauczyć się tego przy pomocy projektu, nad którym pracuję w domu.

Jedną z rzeczy, które ustawiłem w innym projekcie osobistym, jest możliwość kompletnego skonfigurowania i zniszczenia mojej bazy danych Postgres z ant w linii poleceń. Potrafię wycinać i kroić dowolne dane z testu tabeli, sekwencji i integracji, które mi odpowiadają, indywidualnie lub w trakcie koncertu. Jasne, oznacza to, że mam cele o gajillionie ant, ale działa to bardzo dobrze. Lubię to; przez te lata służy mi całkiem dobrze.

Podczas badania, jak to osiągnąć w Maven przez weekend, znalazłem Mojo SQL Maven Plugin. Po przejrzeniu usage page (i używam tego określenia luźno, ponieważ jest to naprawdę pojedynczy pół-przykład bez żadnych wyjaśnień) i example page, udało mi się wymyślić pewne zmiany w moim pliku pom.xml. Naprawiłem kilka oczywistych literówek w tym przykładzie (postgressql) i odwołałem się do PostgreSQL JDBC page, aby upewnić się, że poprawiono ciąg połączenia JDBC. Będę wklej cały pom.xml (zmodyfikowany, aby chronić winnych) poniżej:

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

teraz, bo nie stworzyliśmy bazę danych, to nie pojawi się w \l na linii poleceń 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) 

Tak więc, gdy biegnę mvn sql:execute, spodziewam się moja baza danych, aby tworzone ... Albo przynajmniej nie powiedzie się na zadaniu drop-db-before-test-if-any ponieważ będzie kontynuowany w przypadku błędu. Ale oczywiście:

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

Strona błędu opisana w ostatnim wierszu nie jest pomocna; po prostu mówi mi, że wtyczka spowodowała błąd, a nie sam Maven.

Uruchommy to za pomocą przełącznika -X. Ja po prostu opublikować ciekawy część błędu:

[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 

Ale, ale, ale ... <onError>continue</onError>!

więc do pytania:

  1. Co robię źle? Czy to moje oczekiwania, czy mój kod?
  2. Zauważysz, że mam plik create-person.sql. Z przykładów wiem, że mogę mieć wiele plików, takich jak create-address.sql. Ale w ant, mam możliwość stworzenia tabeli address oddzielnie od tabeli person, o ile wykonuję zadania mrówki, pamiętając o kolejności referencyjnej integralności. Czy jest coś takiego z maven? Jeśli tak to jak?

Przepraszam za gadatliwość i z góry dziękuję za wszelką pomoc.

+0

Zdaję sobie sprawę, że jest to stary wątek, ale możesz znaleźć tę wtyczkę, którą zacząłem pisać: https://github.com/adrianboimvaser/postgresql-maven-plugin. Wciąż jest na wczesnym etapie i brakuje dokumentacji, ale w większości działa. Już wydałem wersję 0.1 dla Maven Central. Twoje zdrowie! – adrianboimvaser

Odpowiedz

4

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

default-cli jest specjalny executionId gdy wtyczka jest wywoływany z linii poleceń. Zobacz this.

Powiązałeś wszystkie wykonania wtyczki sql z fazami cyklu życia maven, ale próbujesz bezpośrednio wywołać wtyczkę.

mvn test powinien działać.

Here jest pokrewną dyskusją na temat SO.

+0

Cóż, to bardzo niefortunne, że Maven nie pozwala mi działać tak jak wcześniej w Ant, ale dzięki za informację. – Mike

Powiązane problemy