我的gradle配置在构建期间不使用正确的类路径

时间:2011-05-16 20:45:35

标签: 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', 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 dependencies将不会成功。

任何指针都非常感激 - 我是Gradle的新手。

3 个答案:

答案 0 :(得分:1)

关于您的项目结构......

拥有一个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,以及生成的jar   建设ProjectA。

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

答案 1 :(得分:0)

我同意之前的回答。经过多次尝试,我们有相同的结构

> shared
 - build.gradle
 - gradle.properties
 - settings.gradle
> project-a 
 - gradle.properties
 - settings.gradle
> project-b 
 - gradle.properties
 - settings.gradle

Shared拥有所有常用代码,在我们的例子中它处理签入,模块部署,代码质量(cobertura),编译等 Shared还定义了子项目继承的类路径,然后可以添加其他依赖项。

针对您的问题:

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

  

settings.gradle includeFlat('Project B')

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

  

settings.gradle includeFlat('Project A')

答案 2 :(得分:0)

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

  

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

不确定你在这说什么,但这可能是我上面解释的结果。也许以下信息也有帮助:取决于项目不会引入其testCompile / testRuntime依赖项。预计您必须为需要它的每个项目声明JUnit。为避免重复,您可以使用configuration injection来声明项目之间的共性。以前的答案已经为此提供了具体的例子(例如subprojects { ... })。