Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting up sbt to use Java 7 for compilation?

Tags:

scala

sbt

I'm getting compile errors when running the compile task as the sources reference new classes in java.nio.file package that only appeared in Java 7.

I have the following in build.sbt:

javaHome := Some(file("/opt/jdk/jdk1.7.0"))

fork := true

In sbt:

> show java-home
[info] Some(/opt/jdk/jdk1.7.0)

It compiles and runs fine in Eclipse. How can I set up sbt to use Java 7 for compilation?

like image 550
Nick A Miller Avatar asked Oct 09 '11 05:10

Nick A Miller


3 Answers

The most reliable (perhaps only) way to do this at the moment it to start SBT with java in the JDK7 folder.

Modify your sbt launcher script; or use this one that allows you to specify Java Home (and so much more!) as command line options.

~/code/scratch/20111009 sbt -java-home /Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64/Contents/Home
Starting sbt: invoke with -help for other options
[info] Loading global plugins from /Users/jason/.sbt/plugins
[info] Set current project to default-3e990a (in build file:/Users/jason/code/scratch/20111009/)
> console
[info] Compiling 1 Scala source to /Users/jason/code/scratch/20111009/target/scala-2.9.1/classes...
[info] Starting scala interpreter...
[info] 
Welcome to Scala version 2.9.1.final (OpenJDK 64-Bit Server VM, Java 1.7.0-internal).
Type in expressions to have them evaluated.
Type :help for more information.

scala> java.util.Objects.equals(null, null)
res0: Boolean = true

Simply setting javaHome := Some(file("/Library/Java/JavaVirtualMachines/openjdk-1.7-x86_64/Contents/Home")) changes the Java version used to compile and fork processes, but does not change the version of the Java standard library on the classpath, nor the version used to run tests, which are always run the the same JVM as SBT.

like image 134
retronym Avatar answered Oct 18 '22 03:10

retronym


If you use Linux or Mac, another possibility is to look at jenv, a command line Java manager.

It allows you to choose per project which JDK to use.

like image 4
Gildas Cuisinier Avatar answered Oct 18 '22 02:10

Gildas Cuisinier


I use virtualenv, which is a tool from the Python ecosystem. In a nutshell, it is a shell script which allows you to change your PATH variable easily and get back to what it was before, if you need to.

  1. First install virtualenvwrapper (a wrapper around virtualenv):

    $ apt-get install virtualenvwrapper

  2. Now create a virtual environment for, say, Java8 with Scala-2.11.

    $ mkvirtualenv j8s11

  3. Now, adjust ~/.virtualenvs/j8s11/bin/postactivate so that you define locations for all your tools. You can see an example below which works for me:

#!/bin/bash

JAVA_VERSION=1.8.0_31
SCALA_VERSION=2.11.5
SBT_VERSION=0.13.7
ANT_VERSION=1.9.4
M2_VERSION=3.2.5
GRADLE_VERSION=1.6
PLAY_VERSION=2.3.7
ACTIVATOR_VERSION=1.2.12
IDEA_VERSION=IC-135.475
PYCHARM_VERSION=community-3.4.1

TOOLS_HOME=/opt/developer
export JAVA_HOME=${TOOLS_HOME}/jdk${JAVA_VERSION}
export SCALA_HOME=${TOOLS_HOME}/scala-${SCALA_VERSION}
export SBT_HOME=${TOOLS_HOME}/sbt-${SBT_VERSION}
export ANT_HOME=${TOOLS_HOME}/apache-ant-${ANT_VERSION}
export M2_HOME=${TOOLS_HOME}/apache-maven-${M2_VERSION}
export GRADLE_HOME=${TOOLS_HOME}/gradle-${GRADLE_VERSION}
export PLAY_HOME=${TOOLS_HOME}/play-${PLAY_VERSION}
export ACTIVATOR_HOME=${TOOLS_HOME}/activator-${ACTIVATOR_VERSION}
export IDEA_HOME=${TOOLS_HOME}/idea-${IDEA_VERSION}
export PYCHARM_HOME=${TOOLS_HOME}/pycharm-${PYCHARM_VERSION}

PATH=${PYCHARM_HOME}/bin:$PATH
PATH=${IDEA_HOME}/bin:$PATH
PATH=${ACTIVATOR_HOME}:$PATH
PATH=${PLAY_HOME}:$PATH
PATH=${GRADLE_HOME}/bin:$PATH
PATH=${M2_HOME}/bin:$PATH
PATH=${ANT_HOME}/bin:$PATH
PATH=${SBT_HOME}/bin:$PATH
PATH=${SCALA_HOME}/bin:$PATH
PATH=${JAVA_HOME}/bin:$PATH
export PATH
  1. Now you can just use workon to switch between environments. Example:
rgomes@terra:~$ workon j8s11

(j8s11)rgomes@terra:~$ java -version
java version "1.8.0_31"
Java(TM) SE Runtime Environment (build 1.8.0_31-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)
(j8s11)rgomes@terra:~$ scala -version
Scala code runner version 2.11.5 -- Copyright 2002-2013, LAMP/EPFL

(j8s11)rgomes@terra:~$ workon j7s10

(j7s10)rgomes@terra:~$ java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)
(j7s10)rgomes@terra:~$ scala -version
Scala code runner version 2.10.4 -- Copyright 2002-2013, LAMP/EPFL
like image 3
Richard Gomes Avatar answered Oct 18 '22 01:10

Richard Gomes