Java 渐变:将子项目的依赖项添加为根项目的依赖项

Java 渐变:将子项目的依赖项添加为根项目的依赖项,java,gradle,dependencies,ear,Java,Gradle,Dependencies,Ear,我们正在WAS 8.5和Gradle 5.*中运行Java EE应用程序来构建它们 在过去,我们将.war应用程序打包在.ear归档中,然后将其部署到服务器上。我们必须将我们的库与应用程序分开,并将它们作为共享库包含,因为根据我们的经验,这会使部署速度大大降低,在某些情况下会耗尽所有系统内存,从而导致服务器崩溃 经过一些实验,我们意识到我们不需要将依赖项提取到共享库中,因为我们可以将它们包含在.ear存档的lib文件夹中 目前,我们通过将.war应用程序的依赖项定义为compileOnly,并在

我们正在WAS 8.5和Gradle 5.*中运行Java EE应用程序来构建它们

在过去,我们将.war应用程序打包在.ear归档中,然后将其部署到服务器上。我们必须将我们的库与应用程序分开,并将它们作为共享库包含,因为根据我们的经验,这会使部署速度大大降低,在某些情况下会耗尽所有系统内存,从而导致服务器崩溃

经过一些实验,我们意识到我们不需要将依赖项提取到共享库中,因为我们可以将它们包含在.ear存档的
lib
文件夹中

目前,我们通过将.war应用程序的依赖项定义为
compileOnly
,并在根项目(生成.ear存档)中将它们重新定义为
earlib
,来实现这一点。我正在寻找一种自动化这个过程的方法

我使用的脚本如下所示:

project.configurations.named('deploy').getAllDependencies().withType(ProjectDependency.class).forEach({dependency ->
    project.configurations.named('earlib').getAllDependencies()
        .addAll(dependency.dependentProject.configurations.named('earlib').getAllDependencies())
})

// This loosely resembles the actual code I used. The thought process is right, it just might have a couple syntax errors.

// Obviously, I defined an `earlib` configuration in the subproject
我尝试在配置阶段以及
ear
任务的
doFirst{}
部分运行此代码。他们都有不同的问题

前者不起作用,因为在代码运行的配置阶段,依赖项似乎还没有配置

后者不起作用,因为我不能只在运行时添加依赖项(回想起来,我甚至尝试过它,听起来很可笑)


我的问题是:我能否在构建生命周期中找到一个阶段,在那里我可以找到并修改依赖关系?还有其他解决我的问题的方法吗?

您的问题的技术答案是您可以使用以下任一方法:

  • 一个
    configuration.incoming.beforesolve
    hook在最后一分钟执行此操作,仅当配置确实需要解决时
  • 使用
    afterEvaluate
    块,假设
    afterEvaluate
    本身中未定义所有其他依赖项
然而,正确的解决方案是利用Gradle的依赖关系管理引擎,并有效地声明构建EAR的根项目依赖于子项目的特定配置

由于不知道您的完整设置和详细信息,我相信以上仍然是更正确的解决方案,尽管您可能需要从结果图中过滤子项目工件

在最近的Gradle版本中如何工作的想法:这里解释的大部分内容都应该适用于最新的5.x版本