Java-Version für Scala-Projekt in sbt erzwingen?

Lesezeit: 4 Minuten

Benutzer-Avatar
Heinrich Geschichte

Meine Scala-Anwendung läuft nur mit Java 7, da sie von Bibliotheken abhängt, die nur in dieser Version des JDK enthalten sind.

Wie erzwinge ich das in sbt, damit dem Benutzer sofort die richtige Fehlermeldung angezeigt wird, wenn er die falsche Version von Java verwendet, wenn er sbt startet, um die Anwendung auszuführen/zu kompilieren?

HINWEIS: Es gibt NEIN Hier zu kompilierender Java™-Quellcode. ich nur Scala-Quellcode haben. Der Scala-Code erfordert eine import java.nio.file.Path das ist ab Java 7 verfügbar.

Benutzer-Avatar
Schleichardt

Verwenden javacOptions ++= Seq("-source", "1.7", "-target", "1.7") funktioniert nicht, wenn Sie keine Java-Quellen haben.

Aber Sie können die Ziel-JVM für den Scala-Compiler in build.sbt oder Build.scala festlegen:

scalacOptions += "-target:jvm-1.7"

Als Ergebnis wird auf einem JDK 6 gedruckt:

$ 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 compile: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 compile:run for the full output.
[error] (compile:run) Nonzero exit code: 1
[error] Total time: 4 s, completed 27.10.2013 14:31:47

Hinweis: Möglicherweise funktioniert es nur für die neueste SBT/Scalac-Version.

Benutzer-Avatar
papacharlie

Für jeden in der Zukunft ist dies auch ein guter Weg, dies zu tun. Es hält die Ausführung sofort an, wenn es die richtige Java-Version nicht finden kann:

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")
}

Du steckst das in deine build.sbt.

  • Es wäre ratsam, die vorherige anzurufen initialize value.

    – david.perez

    7. Juli 2016 um 6:50 Uhr

  • in welcher datei ist das??

    – Jus12

    9. September 2017 um 6:18 Uhr

  • Antwort aktualisiert. Es geht in deine build.sbt Datei

    – Papacharlie

    6. Oktober 2017 um 17:21 Uhr

Da es sich um Scala-Code handelt, können Sie Behauptungen in die Build-Definition einfügen. sbt definiert die initialize als allgemeiner Ort für solche Dinge, aber Sie können jede Einstellung verwenden, einschließlich einer benutzerdefinierten. Zum Beispiel,

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")
}

  • Das macht Sinn. Mir fehlt jedoch der andere Teil: Wie wähle ich aus, welches JDK SBT verwendet? (Irgendwie besteht mein SBT darauf, Java 7 zu verwenden, während ich Java 8-Bibliotheken benötige).

    – Suma

    22. März 2016 um 20:45 Uhr

In SBT 0.13.6 gibt es eine neue VersionNumber Klasse und VersionNumberCompatibility Merkmal. Das Optimieren des von @MarkHarrah empfohlenen Ansatzes zur Verwendung dieses Ansatzes könnte Folgendes bewirken:

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)
}

Um in Java 7 zu kompilieren, sollten Sie die Option javac zum Kompilieren mit Source 1.7 hinzufügen.

Sie sollten hinzufügen javacOptions ++= Seq("-source", "1.7") zu Ihrer SBT-Build-Konfiguration, die sich im /project-Ordner befindet.

Hier ist die Referenz von SBT:
http://www.scala-sbt.org/release/docs/Detailed-Topics/Java-Sources.html

  • Nun, wenn man diesen Code auf 1.6 ausführen würde, wären Fehlermeldungen nicht sehr umfassend.

    – OM Nom Nom

    6. Oktober 2013 um 14:21 Uhr

  • Dieser Abschnitt von SBT befasst sich mit “Unterstützung für das Kompilieren von Java-Quellen”, aber nicht dafür, welche Java-VM von Scala verwendet wird. Derzeit kompiliere ich keine Java-Quellen in meinem Scala-Projekt, ich verwende nur Bibliotheken, die nicht in jdk6 verfügbar sind und nur in jdk7 verfügbar sind

    – Heinrichs Geschichte

    6. Oktober 2013 um 14:55 Uhr

Benutzer-Avatar
Jai

Nur für den Fall, dass Sie Eclipse-basierte scala-ide-Änderungseinstellungen in verwenden

Fenster –> pref — Scala-Compiler –> Standard –> Ziel –> jvm-1.7

Geben Sie hier die Bildbeschreibung ein

  • Nun, wenn man diesen Code auf 1.6 ausführen würde, wären Fehlermeldungen nicht sehr umfassend.

    – OM Nom Nom

    6. Oktober 2013 um 14:21 Uhr

  • Dieser Abschnitt von SBT befasst sich mit “Unterstützung für das Kompilieren von Java-Quellen”, aber nicht dafür, welche Java-VM von Scala verwendet wird. Derzeit kompiliere ich keine Java-Quellen in meinem Scala-Projekt, ich verwende nur Bibliotheken, die nicht in jdk6 verfügbar sind und nur in jdk7 verfügbar sind

    – Heinrichs Geschichte

    6. Oktober 2013 um 14:55 Uhr

1179030cookie-checkJava-Version für Scala-Projekt in sbt erzwingen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy