Gradle:将子项目的依赖项添加为根项目的依赖项

时间:2020-02-17 15:15:16

标签: java gradle dependencies ear

我们正在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

我尝试在配置阶段以及doFirst{}任务的ear部分中运行此代码。他们都有不同的问题。

前者不起作用,因为在运行此代码时似乎在配置阶段,相关性尚未配置。

后者不起作用,因为我不能只在运行时添加 add 依赖项(回想起来,我什至尝试过也很荒谬)。

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

1 个答案:

答案 0 :(得分:1)

对于您的问题的技术解答是,您可以使用以下任一方法:

  • 只有在确实需要解决配置时,configuration.incoming.beforeResolve钩子才能在最后一刻完成。
  • 使用afterEvaluate块,假设所有其他依赖项都不是在afterEvaluate本身中定义的。

但是,正确的解决方案是利用Gradle的依赖性管理引擎,并有效地声明您的根项目(构建EAR的根项目)依赖于子项目的特定配置。

我不知道您的完整设置和详细信息,尽管您可能必须从结果图中过滤子项目工件,但我相信上述方法仍将是更正确的解决方案。

在最近的Gradle版本中如何工作的想法:https://docs.gradle.org/6.2/userguide/cross_project_publications.html那里解释的大多数事情都应该在最新的5.x版本中起作用。