代码之家  ›  专栏  ›  技术社区  ›  Hypnic Jerk

用Gradle编译Java代码库为10和8

  •  0
  • Hypnic Jerk  · 技术社区  · 6 年前

    同时 this question 告诉我确实可以使用 --target --source 以及新的 --release 命令。Java 10和Java 8在设置上非常不同;10使用模块,而8不使用模块。

    我试图通过添加 sourceCompatibility = 1.8 进入我的 build.gradle ,我得到一个 modules are not supported in -source 8 错误。这当然是意料之中的,也是有道理的。

    我能做一些类似的事情,还是这样做,这样我就可以输入一个VAR在我的年级汇编任务,“切换”之间的Java 8和Java 10的编译码?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Hypnic Jerk    6 年前

    结果证明我可以。我把这个问题打出来,然后再做一点调查。唯一的警告是你不能使用任何更高级的Java添加。

    使用gradle,我在run语句中包含了一个变量,类似于 gradle clean assemble -PjavaVer=8

    使用这个变量,我基本上可以关闭哪个代码id想运行。参见下面的示例。

    if(project.hasProperty('javaVer') && javaVer == '8') {
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    }
    
    afterEvaluate {
        repositories {
            mavenCentral()
            jcenter()
            flatDir {
                dirs 'lib'
            }
        }
        compileJava {
            if (project.hasProperty(('javaVer')) && javaVer == '8') {
                excludes = ['**/module-info.java']
            } else {
                doFirst {
                    options.compilerArgs = [
                            '--module-path', classpath.asPath,
                    ]
                    classpath = files()
                }
            }
        }
    }
    

    这将检测变量是否设置为 8 如果是的话 module-info.java 类,并设置 sourceCompatibility targetCompatibility 1.8 . 这对我有效。

    请注意,如果使用Java 10或9的特定代码,则不能这样做。 var 对于Java 10。这就是为什么我们不得不排除 模块-info.java 类,因为它是在Java 9中引入的。

    希望这对其他人有帮助。

        2
  •  0
  •   Tomasz Linkowski    6 年前

    也许这对你有用-最近 Gradle模块插件 (自版本 1.5.0 ,实际上可以编译:

    • 你的主要代码(除了 module-info.java )到Java 8,
    • 你的 模块-info.java ,分别地,Java 9。

    这是由 modularity.mixedJavaRelease 方法。

    下面是一个如何将插件应用于main的示例 build.gradle (假设是多项目构建):

    plugins {
      // your remaining plugins here
    
      id 'org.javamodularity.moduleplugin' version '1.5.0' apply false
    }
    
    subprojects {
      // your remaining subproject configuration here
    
      apply plugin: 'org.javamodularity.moduleplugin'
      modularity.mixedJavaRelease 8 // sets "--release 8" for main code, and "--release 9" for "module-info.java"
    
      // test.moduleOptions.runOnClasspath = true // optional (if you want your tests to still run on classpath)
    }