How do I set a system property for my project in sbt?
Asked Answered
I

3

13

I'm sure I'm missing something really simple... I want to set the system property java.awt.headless to true for my sbt project. Reading the page on properties I think that I need to use system or systemOptional. In my project file I've tried things like:

lazy val javaAwtHeadless = system[Boolean]("java.awt.headless")

Setting it as a user property (e.g. lazy val javaAwtHeadless = property[Boolean]) and setting the accompanying value in build.properties made the property visible in the sbt console but not within sbt's Scala console (via System.getProperty("java.awt.headless")).

set java.awt.headless true from the sbt console works, including being set in the Scala console, but it doesn't persist to the next time I launch sbt.

Infold answered 27/6, 2010 at 9:50 Comment(0)
J
14

A straightforward method would be to edit the batch file or shell script that you use to run sbt and add -Dprop=val

Jazmin answered 27/6, 2010 at 17:27 Comment(5)
Yes, but this would require me to change my sbt launch commands on all the machines I develop on, plus would impact other projects I develop using sbt.Infold
I personally check the sbt launcher and sbt shell script into each project, for example: github.com/scalaz/scalaz. Have you just tried System.setProperty("prop", "val") somewhere in your project definition? Remember that SBT by default runs everything in the same process, unless you explicitly ask to to fork: code.google.com/p/simple-build-tool/wiki/ForkingJazmin
Or in trunk, system.props("prop") = "val". Aaaahh, that's better.Elide
You can do that through a plugin within the shell. I wrote github.com/mustaghattack/jvm-command that does it.Ballesteros
Or, plugin free, just sbt> eval System.setProperty("foo", "bar")Jazmin
C
8

If I needed this option for all sbt tasks, I'd set it as follows in build.sbt

javaOptions += "-Djava.awt.headless=true" 

If it was just for one task, eg: run, you can scope that:

javaOptions in Runtime += "-Djava.awt.headless=true" 
Crisscross answered 24/4, 2014 at 9:5 Comment(0)
B
6

If you're trying to set SBT properties, like plugin settings, then the following worked for me with 0.13+. The following however did work, when trying to pass in Liquibase settings, like password, from our CI frameworks.

In your build.sbt

Ugly, but supplies defaults, and optionally grabs from System.properties. This way you've got your default and override cases covered.

def sysPropOrDefault(propName:String,default:String):String = Option(System.getProperty(propName)).getOrElse(default)

liquibaseUsername := sysPropOrDefault("liquibase.username","change_me")
liquibasePassword := sysPropOrDefault("liquibase.password","chuck(\)orris")

From the commandline

Now just override via -Dprop=value like you would with Maven or other JVM programs. Note props appear before SBT task.

sbt -Dliquibase.password="shh" -Dliquibase.username="bob" liquibase:liquibase-update

Boisvert answered 2/6, 2016 at 16:31 Comment(1)
"Note props appear before SBT task." good shout, this was my issueDancy

© 2022 - 2024 — McMap. All rights reserved.