tengo - verificar java instalado
¿Implementando la versión de Java para el proyecto Scala en sbt? (6)
En SBT 0.13.6 hay una nueva clase VersionNumberCompatibility
y VersionNumberCompatibility
rasgo de VersionNumberCompatibility
. Ajustar el enfoque recomendado por @MarkHarrah para usar este podría hacer lo siguiente:
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)
}
Mi aplicación scala solo se ejecutará con Java 7 ya que depende de las bibliotecas que solo aparecieron en esa versión del JDK.
¿Cómo puedo aplicar eso en sbt, para que el mensaje de error correcto se muestre inmediatamente al usuario si está utilizando la versión incorrecta de Java al iniciar sbt para ejecutar / compilar la aplicación?
NOTA: NO hay código fuente Java ™ para compilar aquí. Solo tengo el código fuente de Scala. El código de Scala requiere una import java.nio.file.Path
que está disponible desde Java 7.
Para compilar en Java 7, debe agregar la opción javac para compilar con la fuente 1.7.
Debe agregar javacOptions ++= Seq("-source", "1.7")
a su configuración de compilación SBT que se puede encontrar en la carpeta / project.
Aquí está la referencia de SBT: http://www.scala-sbt.org/release/docs/Detailed-Topics/Java-Sources.html
Para cualquiera en el futuro, esta es también una buena manera de hacerlo. Detiene la ejecución inmediatamente si no puede encontrar la versión correcta 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")
}
build.sbt
esto en tu build.sbt
.
Siendo el código de Scala, puede poner aserciones en la definición de compilación. sbt define la initialize
como un lugar común para cosas como esta, pero puede usar cualquier configuración, incluida una personalizada. Por ejemplo,
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")
}
Usar javacOptions ++= Seq("-source", "1.7", "-target", "1.7")
no funciona si no tiene fuentes Java.
Pero puede establecer la JVM objetivo para el compilador de Scala en build.sbt o Build.scala:
scalacOptions += "-target:jvm-1.7"
Como resultado, se imprime en 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 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
Nota: Tal vez solo funcione para la última versión de SBT / Scalac.