代码之家  ›  专栏  ›  技术社区  ›  Steve

逐步区分compileJava和tasks.withType(JavaCompile)

  •  0
  • Steve  · 技术社区  · 2 年前

    我目前正在尝试将旧的代码库从Java 8转换为Java 11。这个旧代码库的一部分使用了一些Java内部类(特别是sun.security.x509)。为了在Java 11中实现这一点,我必须在Gradle中的compileJava任务中添加“添加导出”标志,以允许这个内部类在其模块外可见。

    所以我从这个开始:

    compileJava {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    
        options.compilerArgs = [ '--add-exports=java.base/sun.security.x509=ALL-UNNAMED' ]
    }
    

    这似乎不起作用,因为添加导出不会传递给javac,所以我的代码无法编译。

    但是,如果我改为这样做,它可以正常工作,将添加导出正确地传递到javac进程。

    tasks.withType (JavaCompile) {
            sourceCompatibility = JavaVersion.VERSION_11
            targetCompatibility = JavaVersion.VERSION_11
    
            options.compilerArgs = [ '--add-exports=java.base/sun.security.x509=ALL-UNNAMED' ]
    }
    

    很明显,这里有一些我不理解的地方。在我看来,它们在功能上执行相同的操作,但第二个操作有效,而第一个操作失败。

    有人能告诉我区别是什么吗?为什么一个有效,另一个失败?

    0 回复  |  直到 2 年前
        1
  •  2
  •   Slaw    2 年前

    当您这样做时:

    compileJava {
        // configure...
    }
    

    您正在配置名为的特定任务 compileJava 恰好有一种 JavaCompile 。它不会配置任何其他任务。但当你这样做时:

    withType(JavaCompile) {
        // configure...
    }
    

    您正在配置 每项任务 其类型为 JavaCompile 。这包括以下任务 compileTestJava 自从 you've confirmed 1. 这是你的 测试代码 它无法用第一种方法编译,这解释了为什么第二种方法解决了这个问题。


    1.评论引用:“ 这就解释了。在我的测试代码中编译失败的代码。我假设测试代码也是用compileJava编译的,而不是用compileTestJava编译的。自那以后;这不是它的工作方式,在增强compileJava时,我的测试将无法编译是有道理的。谢谢