Domanda

Using Flyway with sbt how can the flywayUrl be specified through system properties (-D) instead of via build.sbt?

I want to run the migrations via command line, specifying all parameters (driver, url, user, password) without defining them in build.sbt.

The plugin documentation page seems to indicate that this should be possible:

Overriding order

System properties > Plugin configuration

I've tried running it like this:

sbt -Dflyway.url=jdbc:h2:file:target/foobar -Dflyway.user=SA flywayMigrate

But the flyway.url property seems to be ignored in favor of the flywayUrl property defined in build.sbt.

Considering a project with these files:

build.sbt

libraryDependencies ++= Seq(
    "com.h2database" % "h2" % "1.3.174"
)

seq(flywaySettings: _*)

flywayUrl := "something that should be overriden"

project/plugins.sbt

addSbtPlugin("com.googlecode.flyway" % "flyway-sbt" % "2.3")

resolvers += "Flyway" at "http://flywaydb.org/repo"

src/main/resources/db/migration/V1__Create_person_table.sql

create table PERSON (
    ID int not null,
    NAME varchar(100) not null
);

Running this command:

$ sbt -Dflyway.url=jdbc:h2:file:target/foobar -Dflyway.user=SA flywayMigrate

Produces this error:

Loading /usr/share/sbt/bin/sbt-launch-lib.bash
[info] Loading project definition from /home/fernando/work/scratch/flyway-sbt/foobar/project
[info] Updating {file:/home/fernando/work/scratch/flyway-sbt/foobar/project/}foobar-build...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Set current project to foobar (in build file:/home/fernando/work/scratch/flyway-sbt/foobar/)
[info] Updating {file:/home/fernando/work/scratch/flyway-sbt/foobar/}foobar...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
com.googlecode.flyway.core.api.FlywayException: Invalid JDBC URL (should start with jdbc:) : something that should be overriden
    at com.googlecode.flyway.core.util.jdbc.DriverDataSource.<init>(DriverDataSource.java:82)
    at com.googlecode.flyway.sbt.FlywayPlugin$FlywayOps$.configure$extension1(FlywayPlugin.scala:214)
    at com.googlecode.flyway.sbt.FlywayPlugin$FlywayOps$.configure$extension0(FlywayPlugin.scala:207)
    at com.googlecode.flyway.sbt.FlywayPlugin$Flyway$.apply(FlywayPlugin.scala:193)
    at com.googlecode.flyway.sbt.FlywayPlugin$$anonfun$flywaySettings$26$$anonfun$apply$1.apply$mcI$sp(FlywayPlugin.scala:145)
    at com.googlecode.flyway.sbt.FlywayPlugin$$anonfun$flywaySettings$26$$anonfun$apply$1.apply(FlywayPlugin.scala:145)
    at com.googlecode.flyway.sbt.FlywayPlugin$$anonfun$flywaySettings$26$$anonfun$apply$1.apply(FlywayPlugin.scala:145)
    at com.googlecode.flyway.sbt.FlywayPlugin$.withContextClassLoader(FlywayPlugin.scala:184)
    at com.googlecode.flyway.sbt.FlywayPlugin$.com$googlecode$flyway$sbt$FlywayPlugin$$withPrepared(FlywayPlugin.scala:167)
    at com.googlecode.flyway.sbt.FlywayPlugin$$anonfun$flywaySettings$26.apply(FlywayPlugin.scala:145)
    at com.googlecode.flyway.sbt.FlywayPlugin$$anonfun$flywaySettings$26.apply(FlywayPlugin.scala:145)
    at scala.Function3$$anonfun$tupled$1.apply(Function3.scala:35)
    at scala.Function3$$anonfun$tupled$1.apply(Function3.scala:34)
    at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47)
    at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42)
    at sbt.std.Transform$$anon$4.work(System.scala:64)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237)
    at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18)
    at sbt.Execute.work(Execute.scala:244)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237)
    at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160)
    at sbt.CompletionService$$anon$2.call(CompletionService.scala:30)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
[error] (*:flywayMigrate) com.googlecode.flyway.core.api.FlywayException: Invalid JDBC URL (should start with jdbc:) : something that should be overriden
[error] Total time: 0 s, completed Feb 7, 2014 3:32:39 PM
È stato utile?

Soluzione

The following is the definition of flywayUrl:

val flywayUrl = settingKey[String]("The jdbc url to use to connect to the database.")

I can't seem to find how the setting could be set through the system property. The plugin doesn't seem to support it.

With that said, you should find the following build.sbt a solution and be able to set its value through an appropriate system property:

flywayUrl := System.getProperty("flyway.url", "[default]")

When sbt executed with no flyway.url set:

$ sbt 'show flywayUrl'
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Set current project to flyway (in build file:/Users/jacek/sandbox/so/flyway/)
[info] [default]

And when it is set on command line:

$ sbt -Dflyway.url=command-line 'show flywayUrl'
[info] Loading global plugins from /Users/jacek/.sbt/0.13/plugins
[info] Set current project to flyway (in build file:/Users/jacek/sandbox/so/flyway/)
[info] command-line

You may also find the other question Setting value of setting on command line when no default value defined in build? useful.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top