gpt4 book ai didi

java - 从单个源文件夹 Gradle 多个 jar

转载 作者:IT老高 更新时间:2023-10-28 20:57:56 24 4
gpt4 key购买 nike

至于现在,我们有一个名为src 的单一源文件夹的项目结构,其中包含三个模块的源代码。我想做的是:

1) 编译源代码。这可以通过 sourceSets 定义轻松完成:

sourceSets {
main {
java {
srcDir 'src'
}
}
}

2) 将编译结果放入三个jar中。我通过三个“jar”类型的任务来做到这一点:

我现在通过三个单独的任务来做这件事:

  • util.jar

    task utilJar(type: Jar) {
    from(sourceSets.main.output) {
    include "my/util/package/**"
    }
    }
  • client.jar

    task clientJar(type: Jar) {
    from(sourceSets.main.output) {
    include "my/client/package/**"
    }
    }
  • server.jar

    task serverJar(type: Jar) {
    from(sourceSets.main.output) {
    include "**"
    }
    excludes.addAll(utilJar.includes)
    excludes.addAll(clientJar.includes)
    }

问题是 server.jar 应该包含 client.jarutil.jar 中未包含的所有类。在 ant 构建脚本中,我们通过使用 difference ant 任务来解决这个问题。这如何在 gradle 中完成(我目前的方法不起作用)?

也许我的方法是完全错误的。请指教。

附:至于现在我们不能更改项目源代码文件夹结构。

最佳答案

我将在此处发布我的工作解决方案作为答案(我在 gradle 的论坛上有提示)。

gradle 中的范围是非常奇怪的东西 :) 我认为每个任务定义都会创建某个“任务”类的对象,在这种特殊情况下类似于“JarTask”。然后我可以从 build.gradle 脚本中的任何位置访问该类的任何属性。但是,我找到了唯一可以看到模式的地方,这些模式包含在 jar 文件中 - 在任务的 from block 内。所以我现在的工作解决方案是:

1) 定义一个项目级集合以包含要从 server.jar

中排除的模式

2) 排除 serverJar 任务的 from block 中的所有模式。

请看下面的最终版本

sourceSets {  
main {
java {
srcDir 'src'
}
}
}

// holds classes included into client.jar and util.jar, so they are to be excluded from server.jar
ext.serverExcludes = []

// util.jar
task utilJar(type: Jar) {
from(sourceSets.main.output) {
include "my/util/package/**"
project.ext.serverExcludes.addAll(includes)
}
}

// client.jar
task clientJar(type: Jar) {
from(sourceSets.main.output) {
include "my/client/package/**"
project.ext.serverExcludes.addAll(includes)
}
}

// server.jar
task serverJar(type: Jar) {
from(sourceSets.main.output) {
exclude project.ext.serverExcludes
}
}

关于java - 从单个源文件夹 Gradle 多个 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20008324/

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