Gradle 的 Eclipse 多个项目中的访问限制

Access restrictions in Eclipse Multiple Projects with Gradle

我在 Eclipse 中有一个 Gradle 项目,由多个子项目组成。我目前有子项目 A、B 和 C。

项目 A 应有权访问项目 B。项目 B 应有权访问项目 C。但项目 A 不应 有权访问项目 C。

A -> B, B -> C, but not A -> C

我可以通过在项目 A 中尝试使用项目 C 中的 class 的 java 示例 class 来轻松测试。

我已经通过 Gradle 在主 build.gradle 文件中使用以下设置并使用 transitive 属性:

实现了这一点
project(':projectA') {
    dependencies {
        compile project(':projectB'), {
            transitive = false
        }
    }
}

project(':projectB') {
    dependencies {
        compile project(':projectC'), {
            transitive = false
        }
    }
}

运行 Gradle 在项目 A 的示例 class 中的 compileJava 给出了正确的错误消息。我希望这个错误应该作为 Eclipse 中的编译错误出现。我还能够以所需关系保持的方式手动配置 class 路径,但是 Gradle Refresh/Rebuild 再次重置 class 路径。

是否可以使用 Gradle 的 Java 编译器而不是 Eclipse 编译器?或者我应该在执行 Gradle Refresh/Rebuild 时影响 classpath 文件吗?是否有不同的解决方案?

我想听听这种情况的首选方法是什么。谢谢!

我能够实现这一点的唯一方法是引用项目的 class 文件,因此:

project(':projectA') {
    dependencies {
        compile files("../projectB/build/classes/main")
    }
}

路径 ../projectB/build/classes/main 应指向 class 文件在您的项目中生成和存储的位置。

我也研究过用 Gradle 的编译器替换 Eclipse 编译器,但是 Eclipse 目前不支持。

您可以使用 gradle eclipse 插件从 gradle 修改 eclipse 项目设置,包括对 eclipse classpath 的更改。我会在 build.gradle:

中尝试这样的事情
allprojects{
    apply plugin:'eclipse'

    eclipse.classpath.file {
        beforeMerged { classpath -> classpath.entries.removeAll{it} }
    }
}

然后 运行 gradle eclipseClasspath 重新生成 .classpath 文件,然后在 eclipse 中一般刷新 / F5 来获取修改后的 .class路径文件。


演示:

我在 build.gradle 中从 transitive=true 开始。当 A 中的 class 在 C 中实例化 class 时,我没有得到编译错误。

现在我在 build.gradle 中更改为 transitive=false 这会导致命令行编译失败,但 eclipse 对旧的依赖信息很满意。 Right-Click->Gradle->Refresh Project没有效果。要让 gradle 取零钱,运行 gradle eclipseClasspath

gradle eclipseClasspath
 :eclipseClasspath
 :A:eclipseClasspath
 :B:eclipseClasspath
 :C:eclipseClasspath

并让 Eclipse 通过刷新获取更改的 .classpath 文件。

这使得 eclipse 识别缺少的传递函数并抛出编译错误:

此时我的全根build.gradle:

allprojects{
    apply plugin:'java'
    apply plugin:'eclipse'

    eclipse.classpath.file {
        beforeMerged { classpath -> classpath.entries.removeAll {it} }
    }
}

project(':A').dependencies {
    compile project(':B'),{ transitive = false }
}

project(':B').dependencies {
    compile project(':C'),{ transitive = false }
}