2015-08-21 13 views
5

Il mio progetto Java 7 sta andando bene in Gradle anche se dipende da java.util.Optional.Opzionale in Java 1.7? Grado Ignorando la compatibilità sorgente/destinazione?

Sono molto, molto confuso. java.util.Optional era solo una cosa in Java 8, giusto?

Ho un progetto Gradle e ho impostato sia sourceCompatibility sia a 1.7.

In una classe in questo modulo ho importare java.util.Optional, che ho pensato non è stato incluso fino Java 8.

Se corro gradlew clean assemble, il compilatore viene chiamato anche con le opzioni giuste. C'è un avvertimento che suona un po 'strano. Tuttavia, il barattolo viene creato bene.

15:51:12.998 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter] Executing actions for task ':core:compileJava'. 
15:51:13.000 [DEBUG] [org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler] Compiler arguments: -source 1.7 -target 1.7 -d /Users/deejay/workspace/number-jumble/core/build/classes/main -g -encoding UTF-8 -classpath /Users/deejay/workspace/number-jumble/model/build/libs/model-1.0.jar:/Users/deejay/.gradle/caches/modules-2/files-2.1/com.badlogicgames.gdx/gdx/1.3.1/18995f8b7b19118975722370818023c76a86fdf4/gdx-1.3.1.jar:/Users/deejay/.gradle/caches/modules-2/files-2.1/com.badlogicgames.gdx/gdx-freetype/1.3.1/1f647429753c8c91fb8fc477ffe5a4c9cde2f429/gdx-freetype-1.3.1.jar:/Users/deejay/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/18.0/cce0823396aa693798f8882e64213b1772032b09/guava-18.0.jar /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/NumberJumbleGame.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/complexity/ChangeComplexityScreen.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/libgdx/SizeToAndLayoutAction.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/libgdx/TimeLabel.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/services/AppropriatelySizedFontService.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/services/DateService.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/session/GameSessionUi.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/session/HardcodedStreakAssessmentService.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/session/LandscapeGameSessionUi.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/session/PortraitGameSessionUi.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/session/RackScreen.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/session/RackSummaryScreen.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/session/StreakAssessmentService.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/splash/ReturnSplashScreen.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/stats/GdxLocalStatisticsRepository.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/stats/MapBackedStatisticsRepository.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/stats/StatisticsRepository.java /Users/deejay/workspace/number-jumble/core/src/main/java/com/binarytweed/numberjumble/stats/StatisticsService.java 
15:51:13.001 [INFO] [org.gradle.api.internal.tasks.compile.jdk6.Jdk6JavaCompiler] Compiling with JDK Java compiler API. 
15:51:13.007 [ERROR] [system.err] warning: [options] bootstrap class path not set in conjunction with -source 1.7 
15:51:13.185 [ERROR] [system.err] 1 warning 

Sto impazzendo?

+0

"[ERRORE] avviso [system.err]: [opzioni] percorso classe bootstrap non impostato insieme a -source 1.7" significa che il compilatore imporrà la sintassi Java 7 ma non può garantire che si utilizzino solo le classi disponibili in Java 7. –

+0

Grazie Oleg - è che "può garantire" che significa "non può garantire"? –

+0

possibile duplicato di [Avviso gradle compileJava task: \ [opzioni \] percorso classe bootstrap non impostato insieme a -source 1.6] (http://stackoverflow.com/questions/16679593/gradle-compilejava-task-warning-options- bootstrap-class-path-not-set-in-conju), anche [avviso: [opzioni] percorso classe bootstrap non impostato in congiunzione con -source 1.5] (https://stackoverflow.com/questions/7816423/warning-options -bootstrap-class-path-not-set-in-combination-with-source-1-5? rq = 1) –

risposta

4

non si ha intenzione mad: D

Il java.util.Optional è stato introdotto in Java 8. Questo è corretto. E suppongo che tu stia compilando su Java 8. Quindi le classi utilizzate (e controllate) sono in effetti quelle di Java 8.

sourceCompatibility riguarda solo gli stili di sintassi utilizzati. Non le classi usate. Con questo set su 1.7 non è possibile usare espressioni lambda, ad esempio. Ma è possibile utilizzare le classi di Java 8. Tuttavia, se si utilizzano le classi del nuovo java, l'applicazione avrà esito negativo in fase di runtime.

targetCompatibility riguarda solo il livello di lingua compilato. Quindi la versione del codice di classe binario java. Di nuovo, l'accesso alle classi java è possibile durante la compilazione, ma fallirà se viene eseguito con una versione precedente di java, semplicemente perché la classe di riferimento non è presente.

+0

Blimey - dieci anni come sviluppatore Java e non ho mai realizzato che questo è il modo in cui ha funzionato! –

+2

@Deejay, vale la pena menzionare l'imminente [JEP-247] (http://openjdk.java.net/jeps/247) che (se implementato) renderà la compilazione di compatibilità più robusta. Verificherà effettivamente se la data classe o metodo esistito nella versione Java selezionata! –