gpt4 book ai didi

gradle - 如何在Gradle中为自定义sourceSet指定output.classesDir?

转载 作者:行者123 更新时间:2023-12-02 08:25:35 24 4
gpt4 key购买 nike

我的构建使用来自两个项目的源代码:ProjectA 和 ProjectB,并使用 ProjectB 中的类和资源生成 JAR。我定义了自定义 sourceSet mainProjectB ,它应该在单独的目录中具有输出:

sourceSets {
mainProjectB {
output.classesDir = "$buildDir/build/classes/projectB"
output.resourcesDir = "$buildDir/build/resources/projectB"
java { srcDirs = ['src/main/java']}
resources { srcDirs = ['src/main/resources']}
}
mainProjectA {
java { srcDirs = [
'../projectA/src/main/java'
]}
resources { srcDirs = [
'../projectA/src/main/resources'
]}
}
test {
java {
srcDirs = [
'../projectA/src/test/java',
'src/test/java'
]}
resources {
srcDirs = [
'../projectA/src/test/resources',
'src/test/resources'
]}
}
}

compileJava {
source sourceSets.mainProjectB.allJava
source sourceSets.mainProjectA.allJava
}

processResources {
from sourceSets.mainProjectB.resources
from sourceSets.mainProjectA.resources
}

jar {
from sourceSets.mainProjectB.output.classesDir
from sourceSets.mainProjectB.output.resourcesDir
}

问题:自定义 sourceSet mainProjectB 忽略指定的输出目录。不会创建目录“$buildDir/build/classes/projectB”和“$buildDir/build/resources/projectB”,因此,JAR 包含来自两个项目(而不是 ProjectB)的文件。

更新:
项目 A 和 B 具有循环依赖关系。这就是为什么他们必须共享源代码。

最佳答案

我会考虑使用子项目和项目来实现您的目标 - gradel docs 。通过以下方法,您可以根据您的构建获取任何类型的 jar 文件:

group 'CoreProject'
version '1.0-SNAPSHOT'
subprojects {
apply plugin: 'java'
repositories {
mavenCentral()
}
}

project (':projectA') {

}

project (':projectB') {
def generatedResources = "$buildDir"
//in case you want resources and classes to be written to custom location where
//redefined paths are relative to projectB root folder
sourceSets {
main {
output.classesDir = 'build/classes/projectB'
output.resourcesDir = 'build/resources/projectB'
}
}
dependencies {
compile project(':projectA')
}
jar {
manifest.mainAttributes(
'Main-Class': "ProjectBClass"
)
}

//To create fat Jar that will contain classes and resources from all dependencies
task fatJar(type: Jar) {
manifest.from jar.manifest
classifier = 'all'
from {
configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }
} {
exclude "ProjectAResource" //if want to exclude resources from projectA
exclude "META-INF/*.SF"
exclude "META-INF/*.DSA"
exclude "META-INF/*.RSA"
}
with jar
}
}

如果您运行projectB的jar任务,将创建​​以下jar,每个jar仅包含自己的类和资源:projectA/build/libs/projectA.jar,< strong>projectB/build/libs/projectB.jar(“包含来自 ProjectB 的类和资源的 JAR”,正如您在评论中所询问的那样)

如果您运行projectB的farJar任务,将创建​​以下jar文件,其中包含两个项目中的类和资源,并且您可以从projectA和projectB项目中排除任何文件模式以创建您想要的任何最终jar例如:projectB/build/libs/projectB-all.jar

这是我为模仿您的场景而创建的项目文件夹结构的屏幕截图(据我所知): enter image description here

附注还要确保文件夹projectB/build和projectA/build没有被任何进程锁定,并删除这些句柄(如果有),否则Gradle将无法运行。

关于gradle - 如何在Gradle中为自定义sourceSet指定output.classesDir?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37333093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com