Fehler mit Maven Mojo sql:execute
TL;DR-version: ich möchte in der Lage sein, die Verwendung der Maven-Mojo SQL Plugin zu erstellen/drop jede Tabelle in meiner DB-schema (oder laden von Daten für die Tabellen) wird über die mvn
Befehl-Linie. Wie?
Ich bin ein langjähriger Java-Entwickler, aber für die meisten Teil habe ich gelebt, in einer ant
-Welt basiert. Ich mag die macht und die Evidenz des ant
, und die Kontrolle, dass es mir über alles. Aber in meinem neuen job, es ist ein push-to-use maven
. Also habe ich beschlossen zu lernen, es mit einem Projekt an dem ich arbeite zu Hause.
Eines der Dinge, ich habe bis auf ein anderes persönliches Projekt ist die Fähigkeit, vollständig eingerichtet und reißen meine Postgres Datenbank aus ant
auf der Kommandozeile. Ich kann slice-and-dice-jede Tabelle, Sequenz-und integration-test-Daten, die ich bitte, einzeln oder im Konzert. Sicher, es bedeutet, dass ich über eine gajillion ant
Ziele, aber es funktioniert sehr gut. Ich mag diese; es diente mir ganz gut über die Jahre.
In der Erforschung, wie dies in Maven über das Wochenende, fand ich die Mojo SQL-Maven-Plugin. Nach einem Blick auf die die Nutzung der Seite (und ich verwende diesen Begriff Locker, wie es eigentlich nur eine einzige semi-Beispiel ohne Erklärungen) und die Beispiel-Seite, ich war in der Lage zu kommen mit ein paar änderungen an meinem pom.xml
- Datei. Ich reparierte einige offensichtliche Tippfehler im Beispiel (PostgreSQL) und verwiesen die PostgreSQL JDBC-Seite um sicherzustellen, dass ich hatte die JDBC-connection-string richtig. Ich werde fügen Sie den pom.xml
(geändert, die Schuldigen zu schützen) unten:
<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>
Nun, da habe ich nicht erstellt die Datenbank, es nicht zeigen, bis in einem \l
auf dem PG-Befehl-Linie:
[mike@mike 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)
So, wenn ich mvn sql:execute
ich erwarte, dass meine Datenbank zu erschaffen...Oder zumindest nicht auf die drop-db-before-test-if-any
Aufgabe, da festgelegt ist, weiterhin auf Fehler. Aber natürlich:
[mike@mike 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
Den Fehler-Seite erwähnt, auf der letzten Zeile gibt es nicht hilfreich, es sagt mir nur, dass ein plugin den Fehler verursacht, nicht von Maven selbst.
Also lasst es mit dem -X
wechseln. Ich werde nur nach den interessanten Teil der Fehlermeldung:
[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
Aber, aber, aber...<onError>continue</onError>
!
So, zu den Fragen:
- Was mache ich falsch? Wird es meinen Erwartungen entspricht, oder meinen code?
- Sie werden bemerken, dass ich eine
create-person.sql
- Datei. Ich weiß aus den Beispielen, dass ich mehrere Dateien gibt, wiecreate-address.sql
. Aber inant
habe ich die Möglichkeit der Erstellung deraddress
Tabelle getrennt von derperson
Tisch, so lange, wie führe ich die ant-tasks unter Berücksichtigung der Reihenfolge der referentiellen Integrität. Ist sowas möglich mitmaven
? Wenn ja, wie?
Sorry für die Ausführlichkeit, und vielen Dank im Voraus für jegliche Hilfe.
- Ich weiß, dies ist ein Alter thread, aber vielleicht finden Sie diese plugins habe ich angefangen zu schreiben nützliche: github.com/adrianboimvaser/postgresql-maven-plugin. Es ist noch in einer frühen Phase und es fehlt die Dokumentation, aber meistens funktioniert. Ich habe bereits version 0.1 freigegeben zu Maven Central. Prost!
Du musst angemeldet sein, um einen Kommentar abzugeben.
default-cli
ist die BesondereexecutionId
wenn das plugin aufgerufen wird, wird der Kommando-Zeile. Sehen diese.Haben Sie gebunden, alle sql-plugin-Ausführung von maven lifecycle Phasen, aber Sie versuchen, rufen Sie das plugin direkt.
mvn test
funktionieren sollte.Hier ist eine Verwandte Diskussion SO.