使用Gradle的Eclipse多项目中的访问限制

Bor*_*ijk 11 java eclipse compilation multi-project gradle

我在Eclipse中有一个包含多个子项目的Gradle项目.我目前有子项目A,B和C.

项目A应该可以访问项目B.项目B应该可以访问项目C.但是项目A 应该访问项目C.

A -> B, B -> C, but not A -> C
Run Code Online (Sandbox Code Playgroud)

我可以通过在Project A中使用java示例类来尝试使用Project C中的类来轻松地测试它.

我使用Gradle在主build.gradle文件中使用以下设置并使用transitive属性实现了这一点:

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

project(':projectB') {
    dependencies {
        compile project(':projectC'), {
            transitive = false
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

compileJava在Project A的示例类上运行Gradle 会给出正确的错误消息.我想将此错误作为Eclipse中的编译错误.我还能够以所需关系保持的方式手动配置类路径,但Gradle Refresh/Rebuild再次重置类路径.

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

我想知道这种情况的首选方法是什么.谢谢!

RaG*_*aGe 3

您可以使用 gradle eclipse 插件从 gradle 修改 eclipse 项目设置,包括对 eclipse 类路径的更改。我会在 build.gradle 中尝试这样的事情:

allprojects{
    apply plugin:'eclipse'

    eclipse.classpath.file {
        beforeMerged { classpath -> classpath.entries.removeAll{it} }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


演示:

我从 build.gradle 开始transitive=true。当 A 中的类实例化 C 中的类时,我不会收到编译错误。

在此输入图像描述

现在我更改为transitive=falsebuild.gradle 这会导致命令行编译失败,但 eclipse 对旧的依赖信息很满意。右键->Gradle->Refresh Project没有效果。要使 gradle 接受更改,请运行gradle eclipseClasspath

gradle eclipseClasspath
 :eclipseClasspath
 :A:eclipseClasspath
 :B:eclipseClasspath
 :C:eclipseClasspath
Run Code Online (Sandbox Code Playgroud)

并让 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 }
}
Run Code Online (Sandbox Code Playgroud)