【问题标题】:Gradle subproject not included in classpathGradle 子项目未包含在类路径中
【发布时间】:2014-04-29 17:41:08
【问题描述】:

我们有 2 个项目,1 个主项目和 1 个子项目,它们是 Java 项目。 它们都在同一个目录下。

目录结构如下所示:

 ./dev
   ./Project_A
     build.gradle
     settings.gradle
   ./Project_B
     build.gradle

Project_A 包括 Project_B。

Project_A settings.gradle 看起来像:

includeFlat 'Project_B'

Project_A build.gradle 包含:

compile project(':Project_B')   

问题 从命令行编译时,Project_A 错过了 Project_B 中的类 (gradlew clean build)。 看起来 Project_B 不属于 Project-A 的类路径。

这是来自 gradlew clean build 的(输出的一部分)在 Project_A 目录中运行(之后都是“缺少包 project_b.x.y”和“找不到符号”(来自 Project_B) :

:clean
:Project_B:clean
:Project_B:compileJava
:Project_B:processResources
:Project_B:classes
:Project_B:jar UP-TO-DATE
:compileJava
...Starts erroring out here...

我猜这是一个类路径问题,但我不知道如何解决它。

提前致谢, 杰米

PS:已编辑问题,因为我能够通过 2 个项目构建(最初是 3 个)重现该问题

【问题讨论】:

  • 一个 Gradle 构建只能有一个 settings.gradle。有关多项目构建的详细信息,请参阅Gradle User Guide 中的“多项目构建”一章,以及完整 Gradle 发行版中的许多示例。
  • 嗨彼得,但是我们如何构建 Project_B 呢?
  • 我不明白这个问题。我建议先研究文档和示例。
  • 好的,阅读文档...仍然感觉我们遵循规范(bar 子项目不在子目录中)...缩小到 2 个项目...仍然失败...现在失败在 Eclipes 和命令行中...
  • 我不清楚您的目录结构是什么,以及“Project_A 包括 Project_B”是什么意思。无论如何,很可能您的settings.gradle 位于错误的目录中。

标签: java gradle subproject


【解决方案1】:

基于Java Quckstart: Multi-project Java build

1) 您的 settings.gradle 文件需要在 dev/ 中,而不是 dev/project_A 中,并且应该包含以下内容:

include 'Project_A', 'Project_B'

2) 那么你的dev/Project_A/build.gradle 文件应该包含

dependencies {
    compile project(':Project_B')
}

编辑:

我按照您在问题中描述的项目布局创建了一个玩具示例。但是,我无法重现该问题。也许您将能够发现导致您的特定错误的一些差异:

目录树

├── 项目_A │   ├── build.gradle │   ├── settings.gradle │   └── src │   └── 主要 │   └── java │   └── 一个 │   └── A.java └── 项目_B ├── build.gradle └── 源 └── 主要 └── java └── b └── B.java

Project_A/build.gradle

apply plugin: 'java'
apply plugin: 'application'

mainClassName = 'a.A'

dependencies {
    compile project(':Project_B')
}

Project_A/settings.gradle

includeFlat 'Project_B'

A.java

package a;
import b.B;

public class A {
    public static void main(String[] args) {
        System.out.println("From A.main...");
        B.call();
    }
}

Project_B/build.gradle

apply plugin: 'java'

B.java

package b;

public class B {
    public static void call() {
        System.out.println("Calling B");
    }
}

Project_A 运行 Gradle 时,输出为:

$ gradle clean build 运行 :clean 最新的 :Project_B:clean UP-TO-DATE :Project_B:compileJava :Project_B:processResources 最新 :Project_B:类 :Project_B:jar :编译Java :processResources 最新 :类 :罐 :集合 :compileTestJava 最新 :processTestResources 最新 :testClasses 最新 :测试最新 :检查最新的 :建造 :Project_B:组装 :Project_B:compileTestJava UP-TO-DATE :Project_B:processTestResources 最新 :Project_B:testClasses 最新 :Project_B:test UP-TO-DATE :Project_B:检查最新 :Project_B:构建 :跑 来自 A.main... 呼叫 B 构建成功

【讨论】:

  • 嗨,AFAIU,includeFlat 也是为了做同样的事情(包括同一目录级别的项目)。这些项目很好地包含(在调用主项目任务时调用它们的任务),问题是它们似乎不存在于主项目构建路径中......
  • @jmc34 你说得对includeFlat,对此感到抱歉。但是,我无法重现您的问题(请参阅我编辑的问题...)。
  • 非常感谢,我会尝试将 settings.gradle 放在主项目之外,但我没有太大希望。正如您所证明的那样,它应该以任何一种方式工作,并且对我们有用。出于某种原因,我不明白它被破坏了,并且将代码还原回来并不能修复。我很困惑。
  • @jmc34 我希望你能正常工作并找出原因。也许在Project_A 上运行gradle dependencies 并查看是否列出了Project_B。唯一想到的其他事情可能是最新版本的 Gradle 会神奇地解决问题?也许您将依赖项放在错误的位置(例如在buildscript { dependencies { compile project(':Project_B') } } 而不是根dependencies { } 下)?但这些只是在黑暗中拍摄......祝你好运!
【解决方案2】:

好的,如果这对某人有用,我终于通过实际删除 (git rm) .claspath 文件来完成这项工作。它在 .gitignore 中,但由于某种原因,它似乎在某个时候被提交并正在播放。

执行此操作并在 Eclipse 中重新导入项目后一切恢复正常。

感谢那些试图提供帮助的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    相关资源
    最近更新 更多