将另一个Java源代码目录添加到Gradle脚本

51

我有一个示例Java项目包

包名为com.example.testing;

文件树如下:

app
|
  src->com->example->testing->Main.java

以及一个Gradle脚本:

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

sourceSets {
    main {
        java {
            srcDirs 'src'
        }
    }


}

sourceSets.main.output.classesDir = file("classes")
mainClassName = 'com.example.testing.Main'

defaultTasks 'compileJava', 'run'
现在我想给这个项目添加一些模块,我的文件夹将是这样的。
app
|
  src1->com->example->testing->Main.java

  src2->com->another_example->another_testing->Library.java

我该如何向Gradle脚本中添加新的源代码?


6
为什么不遵守标准的gradle/Maven惯例?如果这样做,所有东西都可以自动正常工作,而不需要配置所有路径。 - JB Nizet
13
比如说,我希望有一个单独的目录来存放生成的源代码。 - Florian F
4个回答

62

我同意@JB Nizet关于尊重标准约定的观点。但如果你仍然坚持成为一个无政府主义者:

你已经在你的sourceset中声明了src,为什么不添加src1src2呢?你可以将它们添加到同一个sourceset中,或者如果你想要的话,为每个模块定义一个sourceset。

sourceSets {
    main {
        java {
            srcDirs 'src'
            srcDirs 'src1'
            srcDirs 'src2'
        }
    }
 }

如需引用项目外的文件,请参阅此答案


20
我同意使用标准规范,不过在处理“生成”的源代码时,以下这个技巧非常有用,因为这些源代码会被扔到生成工具觉得合适的地方...所以,谢谢! - Marco Massenzio

25

这个问题是关于“添加”的;文字描述了一个更具体的情境。如果只想要添加已经存在的目录,那么可以使用以下方法进行添加

sourceSets.main.java.srcDirs += ['src/gen/java']

一个完整的build.gradle示例如下:

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'com.squareup:javapoet:1.12.1'
}

sourceSets.main.java.srcDirs += ['src/gen/java']

JavaPoet 是一个用于生成.java源文件的Java API。它仅被用作build.gradle文件的示例库。


17

我在Gradle 4.6中采用了略有不同的方法:

sourceSets {
    main {
        java {
            srcDir 'src/main/java'
            srcDir 'build/swagger-code-dummy/src/main/java'
        }
    }
}

正如你所见,我不得不指定包含“/main/java”子目录的目录,否则gradle/intellij将无法设置正确的路径。

也许这对其他人也有帮助 :)


如果您的项目涉及多种语言,例如Python或Bash,并且您需要将这些目录视为源根目录,则这也非常有用。 - Jonathan E. Landrum
你在什么时候做这个?是在生成代码之前还是之后?而且你需要添加依赖吗? - arc1880

13

稍微不同的解决方案:

sourceSets.main.java.srcDirs = ['build/jasper', 'src/main/java']

我正在使用VSCode和gradle,并且在build.gradle中添加了一行类似的代码解决了这个问题。 - Panagiotis Piperopoulos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接