71

私の scala アプリケーションは、Java 7 でのみ実行されます。これは、そのバージョンの JDK にのみ表示されるライブラリに依存するためです。

アプリケーションを実行/コンパイルするために sbt を起動するときに間違ったバージョンの Java を使用している場合に、ユーザーに正しいエラー メッセージがすぐに表示されるように、sbt でそれを強制するにはどうすればよいですか?

注:ここでコンパイルする Java™ ソース コードはありません。私はScalaのソースコードしか持っていません。Scala コードには、import java.nio.file.PathJava 7 から使用できる が必要です。

4

6 に答える 6

59

javacOptions ++= Seq("-source", "1.7", "-target", "1.7")Java ソースがない場合は使用できません。

ただし、build.sbt または Build.scala で Scala コンパイラのターゲット JVM を設定できます。

scalacOptions += "-target:jvm-1.7"

その結果、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

注: 最新の SBT/Scalac バージョンでのみ機能する可能性があります。

于 2013-10-27T13:36:18.817 に答える
21

Scala コードであるため、アサーションをビルド定義に入れることができます。sbt はinitializeをこのような共通の場所として定義していますが、カスタム設定を含む任意の設定を使用できます。例えば、

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")
}
于 2013-10-09T12:19:08.747 に答える
16

SBT 0.13.6 には、新しいVersionNumberクラスとVersionNumberCompatibilityトレイトがあります。これを使用するために@MarkHarrahが推奨するアプローチを微調整すると、次のことが可能になります。

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)
}
于 2014-10-03T10:39:58.333 に答える
3

Java 7 でコンパイルするには、javac オプションを追加してソース 1.7 でコンパイルする必要があります。

javacOptions ++= Seq("-source", "1.7")/project フォルダーにある SBT ビルド構成に追加する必要があります。

SBT からの参照は次のとおりです 。 http://www.scala-sbt.org/release/docs/Detailed-Topics/Java-Sources.html

于 2013-10-06T14:14:52.357 に答える
2

eclipse ベースの scala-ide 変更設定を使用する場合に備えて

ウィンドウ --> pref -- scala コンパイラ --> 標準 --> ターゲット --> jvm-1.7

ここに画像の説明を入力

于 2016-09-06T20:54:39.087 に答える