Application de la version Java pour le projet Scala dans sbt?

Mon application scala ne fonctionnera qu’avec Java 7, car elle dépend de bibliothèques apparues uniquement dans cette version du JDK.

Comment puis-je appliquer cela dans sbt, de sorte que le message d’erreur correct s’affiche immédiatement à l’utilisateur si elle utilise la mauvaise version de Java lors du démarrage de sbt pour exécuter / comstackr l’application?

REMARQUE: Il n’y a pas de code source Java ™ à comstackr ici. Je n’ai que le code source Scala. Le code Scala nécessite un import java.nio.file.Path de Java 7.

Utiliser javacOptions ++= Seq("-source", "1.7", "-target", "1.7") ne fonctionne pas si vous n’avez pas de source Java.

Mais vous pouvez définir la machine virtuelle Java cible pour le compilateur Scala dans build.sbt ou Build.scala:

 scalacOptions += "-target:jvm-1.7" 

En conséquence, il imprime sur un JDK 6:

 $ sbt clean run [info] Set current project to default-cd5534 (in build file:/tmp/so/) [success] Total time: 0 s, completed 27.10.2013 14:31:43 [info] Updating {file:/tmp/so/}default-cd5534... [info] Resolving org.fusesource.jansi#jansi;1.4 ... [info] Done updating. [info] Compiling 1 Scala source to /tmp/so/target/scala-2.10/classes... [info] Running Main [error] (run-main) java.lang.UnsupportedClassVersionError: Main : Unsupported major.minor version 51.0 java.lang.UnsupportedClassVersionError: Main : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:634) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:277) at java.net.URLClassLoader.access$000(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:212) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:205) at java.lang.ClassLoader.loadClass(ClassLoader.java:321) at java.lang.ClassLoader.loadClass(ClassLoader.java:314) [trace] Stack trace suppressed: run last comstack:run for the full output. java.lang.RuntimeException: Nonzero exit code: 1 at scala.sys.package$.error(package.scala:27) [trace] Stack trace suppressed: run last comstack:run for the full output. [error] (comstack:run) Nonzero exit code: 1 [error] Total time: 4 s, completed 27.10.2013 14:31:47 

Note: Peut-être que cela ne fonctionne que pour la dernière version de SBT / Scalac.

En tant que code Scala, vous pouvez placer des assertions dans la définition de construction. sbt définit l’ initialize comme un lieu commun pour des choses comme celles-ci, mais vous pouvez utiliser n’importe quel paramètre, y compris un paramètre personnalisé. Par exemple,

 initialize := { val _ = initialize.value // run the previous initialization val classVersion = sys.props("java.class.version") val specVersion = sys.props("java.specification.version") assert(..., "Java N or above required") } 

Pour quiconque dans le futur, c’est aussi un bon moyen de le faire. Il arrête immédiatement l’exécution s’il ne trouve pas la bonne version de Java:

 initialize := { val _ = initialize.value // run the previous initialization val required = "1.8" val current = sys.props("java.specification.version") assert(current == required, s"Unsupported JDK: java.specification.version $current != $required") } 

Vous mettez cela dans votre build.sbt .

Dans SBT 0.13.6, il existe une nouvelle classe VersionNumberCompatibility et VersionNumberCompatibility trait VersionNumberCompatibility . Modifier l’approche recommandée par @MarkHarrah pour utiliser celui-ci pourrait faire ce qui suit:

 initialize := { val _ = initialize.value // run the previous initialization val required = VersionNumber("1.8") val curr = VersionNumber(sys.props("java.specification.version")) assert(CompatibleJavaVersion(curr, required), s"Java $required or above required") } ... /** Java specification version compatibility rule. */ object CompatibleJavaVersion extends VersionNumberCompatibility { def name = "Java specification compatibility" def isCompatible(current: VersionNumber, required: VersionNumber) = current.numbers.zip(required.numbers).foldRight(required.numbers.size<=current.‌​numbers.size)((a,b) => (a._1 > a._2) || (a._1==a._2 && b)) def apply(current: VersionNumber, required: VersionNumber) = isCompatible(current, required) } 

Pour comstackr en Java 7, vous devez append l’option javac pour comstackr avec la source 1.7.

Vous devez append javacOptions ++= Seq("-source", "1.7") à votre configuration de construction SBT qui se trouve dans le dossier / project.

Voici la référence de SBT: http://www.scala-sbt.org/release/docs/Detailed-Topics/Java-Sources.html

Juste au cas où vous utilisez les parameters de changement Scala-ide basés sur éclipse dans

window -> pref – scala comstackr -> standard -> target -> jvm-1.7

entrer la description de l'image ici