Build 我的gradle配置在生成期间未使用正确的类路径

Build 我的gradle配置在生成期间未使用正确的类路径,build,classpath,gradle,Build,Classpath,Gradle,我有一个多项目设置(ProjectB->ProjectA),我使用flatDir在每个项目中指定一个lib目录 项目A: repositories { flatDir name: 'localRepository', dirs: 'lib' } dependencies { compile group: 'com.google.guava', name: 'guava', version: 'r08' compile group: 'com.miglayout', na

我有一个多项目设置(ProjectB->ProjectA),我使用flatDir在每个项目中指定一个lib目录

项目A:

repositories {
    flatDir name: 'localRepository', dirs: 'lib'
}

dependencies {
    compile group: 'com.google.guava', name: 'guava', version: 'r08'
    compile group: 'com.miglayout', name: 'miglayout', version: '3.7.4'
    testCompile group: 'junit', name: 'junit', version: '4.+'
    testCompile group: 'org.easymock', name: 'easymock', version: '2.5.2'
}
项目B:

repositories {
    flatDir name: 'localRepository', dirs: 'lib'
}

dependencies {
    compile group: 'yan', name: 'yan', version: '5.0.2'
    runtime group: 'yan', name: 'jfunutil', version: '5.0.2'
    compile project(':ProjectA')
    testCompile group: 'junit', name: 'junit', version: '4.+'
    testCompile group: 'org.easymock', name: 'easymock', version: '2.5.2'
}

当我对ProjectB使用
gradle dependencies
时,会生成正确的依赖项列表,显示ProjectA的可传递依赖项(例如,包括guava-r08)。但是,当我创建gradle build时,javac使用的实际类路径只包括ProjectB的直接依赖项和构建ProjectA生成的jar

另一个麻烦是,对于testCompile,我必须重新声明ProjectB对junit的依赖关系,否则
gradle依赖关系
将不会成功

非常感谢任何建议-我是Gradle的新手。

关于您的项目结构…

似乎最好是有一个lib文件夹,而不是每个项目都有一个

您的目录结构如下所示:

project/settings.gradle
project/ProjectA/lib
project/ProjectA/src
project/ProjectB/lib
project/ProjectB/src
您希望每个子项目都有一个lib文件夹,有什么特别的原因吗?这似乎是个更好的主意:

project/settings.gradle
project/lib
project/ProjectA/src
project/ProjectB/src
您可以在项目根目录(project/build.gradle)中创建包含以下内容的build.gradle:

subprojects{
   apply plugin: 'java'
   repositories {
        flatDir name: 'localRepository', dirs: "$rootProject.projectDir/lib"
   }
}
通过这种方式,您可以将所有依赖项放到project/lib中

关于您的测试依赖性…

您还可以将testCompile依赖项放在这个根build.gradle文件中。它变成:

subprojects{
   apply plugin: 'java'
   repositories {
        flatDir name: 'localRepository', dirs: "$rootProject.projectDir/lib"
   }
   dependencies{
        testCompile group: 'junit', name: 'junit', version: '4.+'
        testCompile group: 'org.easymock', name: 'easymock', version: '2.5.2'
   }
}
这样,您就不必在每个子项目的build.gradle文件中指定testCompile依赖项

然而,当我逐渐构建时 仅用于javac的实际类路径 包括的直接依赖项 ProjectB和 建设项目A


为了编译ProjectB,您只需要ProjectA。只有ProjectA是编译依赖项;ProjectA编译依赖项成为ProjectB的可传递依赖项。

我同意前面的答案。经过多次尝试,我们得到了相同的结构

> shared
 - build.gradle
 - gradle.properties
 - settings.gradle
> project-a 
 - gradle.properties
 - settings.gradle
> project-b 
 - gradle.properties
 - settings.gradle
Shared拥有所有公共代码,在我们的例子中,它处理签入、模块部署、代码质量(cobertura)、编译等 Shared还定义了子项目继承的类路径,子项目可以添加其他依赖项

针对您的问题:

您是否在项目A中定义了以下内容

settings.gradleincludeFlat(“项目B”)

您是否在项目B中定义了以下内容

settings.gradleincludeFlat(“项目A”)


原始帖子中的构建脚本很好。可传递依赖项解析不起作用的原因是,项目将只使用自己的存储库来解析其配置。因此,解决问题的一种方法是只使用一个lib目录。另一个解决方案是为B声明指向a的lib目录的第二个存储库

另一个烦恼是,对于testCompile,我必须重新声明对junit for ProjectB的依赖关系,否则gradle依赖关系将不会成功


我不知道你在说什么,但这可能是我上面解释的结果。也许以下信息也有帮助:根据项目的不同,它不会拉入其
testCompile
/
testRuntime
依赖项。您需要为每个需要JUnit的项目声明JUnit。为了避免重复,可以使用声明项目之间的共性。之前的答案已经给出了具体的例子(例如,
子项目{…}
)。

谢谢你的建议,不过也许我简化了太多。其想法是ProjectA是一个通用图书馆。它包含我的常用工具等,我还有3个依赖于ProjectA的其他项目(应用程序)。项目A应该完全独立于其他项目,此外,其他项目(项目B、C、D)彼此独立。这就是为什么我不太喜欢全局lib思想,以及分层项目结构。(不过,我并没有完全拒绝这一点——因此感谢您的努力!)这看起来与上一个答案略有不同:在上一个答案中,似乎共享库文件夹是在根项目中定义的,而ProjectA和ProjectB是根项目的子项目。在您的情况下,看起来shared是project-a和project-b的兄弟。我更喜欢这样一个扁平的层次结构。考虑是否有共享A和共享B(两个独立的核心项目,可供应用程序级项目使用。您的解决方案是否支持此结构?谢谢!是的,这就是我们使用它的方式,如果您愿意,我将发布更多详细信息,但我想您现在可能已经了解了。我只做了一个非常简单的项目,使结构正常工作,然后添加了所有真实的代码。我发现Gradle的问题是,文档不够成熟,你永远不知道哪种方法是最好的。我希望这不是一个因学习资源不足而逐渐消失的项目。谢谢,但仍然卡住了:我尝试了项目B:includeFlat(“项目a”)。因为B依赖于A,所以我不希望必须将includeFlat(“项目B”)用于A(A不应该知道B的任何信息)。我的构建现在在B上执行gradle构建时失败-gradle确定它必须先构建A(是),然后尝试解析A对B的库文件夹的jar依赖关系(否!),所以它发现没有一个JAR和project A不能编译。这很令人沮丧,因为看起来你的结构正是我想要的-谢谢!好吧,所以我认为这个谜题缺少的部分是project A需要了解project b,至少有一个参考。当我在project b中运行compile时,我会像从project A中运行它一样“gradle项目:编译