【问题标题】:Optional in Java 1.7? Gradle Ignoring Source/Target Compatibility?在 Java 1.7 中是可选的? Gradle忽略源/目标兼容性?
【发布时间】:2015-11-15 14:24:16
【问题描述】:

我的 Java 7 项目在 Gradle 中构建良好,尽管它依赖于 java.util.Optional

我非常非常困惑。 java.util.Optional 只是 Java 8 中的一个东西,对吧?

我有一个 Gradle 项目,我已将 sourceCompatibilitytargetCompatibility 都设置为 1.7

在这个模块的一个类中,我导入了 java.util.Optional,我认为直到 Java 8 才包含它。

如果我运行gradlew clean assemble,编译器甚至会被正确的选项调用。有一个警告听起来有点可疑。但是,jar 构建得很好。

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

我要疯了吗?

【问题讨论】:

标签: java gradle java-8 optional


【解决方案1】:

你不会发疯的:D

java.util.Optional 是在 Java 8 中引入的。这是正确的。而且我猜您正在针对 Java 8 进行编译。所以使用(和检查)的类实际上是 Java 8 的类。

sourceCompatibility 仅影响使用的语法样式。不是使用的类。例如,将此设置为 1.7 时,您不能使用 lambda 表达式。但是您可以使用 Java 8 的类。但是,如果您使用新 Java 的类,您的应用程序将在运行时失败。

targetCompatibility 只影响编译语言级别。所以java二进制类代码的版本。同样,在编译期间可以访问 java 类,但如果使用旧版本的 java 执行它会失败,因为引用的类不存在。

【讨论】:

  • Blimey - 作为一名 Java 开发人员已有 10 年了,但我从未意识到这就是它的工作原理!
  • @Deejay,值得一提的是即将推出的JEP-247(如果实施)将使兼容性编译更加健壮。它实际上会检查给定的类或方法是否存在于所选的 Java 版本中!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 2017-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多