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