Java-versie afdwingen voor Scala-project in sbt?

Mijn scala-toepassing werkt alleen met Java 7 omdat het afhankelijk is van bibliotheken die alleen in die versie van de JDK verschenen.

Hoe kan ik dat in sbt afdwingen, zodat de gebruiker onmiddellijk de juiste foutmelding krijgt als ze de verkeerde versie van Java gebruikt bij het starten van sbt om de applicatie uit te voeren/compileren?

OPMERKING: er is GEENJava™-broncode om hier te compileren. Ik heb alleende broncode van Scala. De Scala-code vereist een import java.nio.file.Pathdie beschikbaar is vanaf Java 7.


Antwoord 1, autoriteit 100%

Het gebruik van javacOptions ++= Seq("-source", "1.7", "-target", "1.7")werkt niet als u geen Java-bronnen heeft.

Maar u kunt de doel-JVM voor de Scala-compiler instellen in build.sbt of Build.scala:

scalacOptions += "-target:jvm-1.7"

Als resultaat wordt afgedrukt op een 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 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

Opmerking: misschien werkt het alleen voor de nieuwste SBT/Scalac-versie.


Antwoord 2, autoriteit 42%

Voor iedereen in de toekomst is dit ook een goede manier om het te doen. Het stopt de uitvoering onmiddellijk als het de juiste Java-versie niet kan vinden:

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

Je plaatst dit in je build.sbt.


Antwoord 3, autoriteit 36%

Omdat het Scala-code is, kunt u beweringen in de builddefinitie plaatsen. sbt definieert de initializeals een gebruikelijke plaats voor dit soort dingen, maar je kunt elke instelling gebruiken, inclusief een aangepaste. Bijvoorbeeld,

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

Antwoord 4, autoriteit 27%

In SBT 0.13.6 is er een nieuwe klasse VersionNumberen eigenschap VersionNumberCompatibility. Het aanpassen van de door @MarkHarrah aanbevolen aanpak om deze te gebruiken, kan het volgende doen:

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

Antwoord 5, autoriteit 5%

Om te compileren in Java 7, moet je de javac-optie toevoegen om te compileren met bron 1.7.

U moet javacOptions ++= Seq("-source", "1.7")toevoegen aan uw SBT-buildconfiguratie die u kunt vinden in de map /project.

Hier is de referentie van SBT:
http://www.scala-sbt.org/release /docs/Detailed-Topics/Java-Sources.html


Antwoord 6, autoriteit 3%

Voor het geval dat u op eclips gebaseerde scala-ide wijzigingsinstellingen gebruikt in

venster –> pref — scala compiler –> standaard –> doel –> jvm-1.7

voer hier de afbeeldingsbeschrijving in

Other episodes