2015-08-21 13 views
5

Dự án Java 7 của tôi đang xây dựng tốt ở Gradle mặc dù nó phụ thuộc vào java.util.Optional.Tùy chọn trong Java 1.7? Gradle bỏ qua nguồn/mục tiêu tương thích?

Tôi rất, rất bối rối. java.util.Optional chỉ là một điều trong Java 8, phải không?

Tôi có dự án Gradle và tôi đã đặt cả hai sourceCompatibilitytargetCompatibility thành 1.7.

Trong một lớp trong mô-đun này, tôi nhập java.util.Optional, mà tôi nghĩ không được đưa đến Java 8.

Nếu tôi chạy gradlew clean assemble, trình biên dịch thậm chí được gọi với các tùy chọn đúng. Có một cảnh báo rằng âm thanh một chút fishy mặc dù. Tuy nhiên, lọ được xây dựng tốt.

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 

Tôi có phát điên không?

+0

"[ERROR] [system.err] cảnh báo: [tùy chọn] đường dẫn lớp khởi động không được đặt cùng với nguồn 1.7" có nghĩa là trình biên dịch sẽ thực thi cú pháp Java 7 nhưng không thể đảm bảo rằng bạn chỉ sử dụng các lớp có sẵn trong Java 7. –

+0

Cảm ơn Oleg - là "có thể đảm bảo" có nghĩa là "không thể đảm bảo"? –

+0

có thể trùng lặp với [cảnh báo tác vụ Gradle compileJava: \ [tùy chọn \] đường dẫn lớp khởi động không được đặt cùng với nguồn 1.6] (http://stackoverflow.com/questions/16679593/gradle-compilejava-task-warning-options- bootstrap-class-path-not-set-in-conju), cũng [cảnh báo: [tùy chọn] đường dẫn lớp bootstrap không được thiết lập kết hợp với -source 1.5] (https://stackoverflow.com/questions/7816423/warning-options -bootstrap-class-path-not-set-in-kết hợp-với-source-1-5? rq = 1) –

Trả lời

4

Bạn sẽ không điên: D

Các java.util.Optional đã được giới thiệu trong Java 8. Đó là đúng. Và tôi đoán bạn đang biên dịch chống lại Java 8. Vì vậy, các lớp được sử dụng (và được kiểm tra) trên thực tế là các lớp của Java 8.

sourceCompatibility chỉ ảnh hưởng đến kiểu cú pháp được sử dụng. Không phải các lớp được sử dụng. Với thiết lập này là 1.7, bạn không thể sử dụng các biểu thức lambda chẳng hạn. Nhưng bạn có thể sử dụng các lớp Java 8. Bao giờ nếu bạn sử dụng các lớp của java mới, ứng dụng của bạn sẽ thất bại trong thời gian chạy.

targetCompatibility chỉ ảnh hưởng đến cấp độ ngôn ngữ được biên dịch. Vì vậy, phiên bản của mã lớp nhị phân java. Một lần nữa, truy cập vào các lớp java là có thể trong quá trình biên dịch, nhưng nó sẽ thất bại nếu nó được thực hiện với một phiên bản cũ hơn của java, đơn giản chỉ vì lớp tham chiếu không có mặt.

+0

Blimey - mười năm với tư cách là nhà phát triển Java và tôi chưa bao giờ nhận ra đây là cách nó hoạt động! –

+2

@Deejay, đáng nói đến [JEP-247] sắp tới (http://openjdk.java.net/jeps/247) (nếu được triển khai) sẽ làm cho việc biên dịch tương thích mạnh mẽ hơn. Nó sẽ thực sự kiểm tra xem lớp hoặc phương thức đã cho tồn tại trong phiên bản Java đã chọn hay chưa! –

Các vấn đề liên quan