0

我有一个多项目设置(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'

}

当我gradle dependencies用于 ProjectB 时,会生成正确的依赖关系列表,显示来自 ProjectA 的传递依赖关系(例如,包括 guava-r08)。但是,当 I 时gradle build,实际用于 javac 的类路径仅包括 ProjectB 的直接依赖项,以及构建 ProjectA 生成的 jar。

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

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

4

3 回答 3

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 依赖项。

但是,当我gradle build时,javac实际使用的classpath只包含ProjectB的直接依赖,以及构建ProjectA生成的jar。

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

于 2011-05-17T01:01:54.737 回答
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')

于 2011-05-19T12:29:16.060 回答
0

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

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

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

于 2012-05-17T10:07:22.080 回答