我们正在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 依赖项(回想起来,我什至尝试过也很荒谬)。
我的问题是:我可以在构建生命周期中找到一个阶段,在其中可以找到并修改依赖项吗?有其他解决方法可以解决我的问题吗?
答案 0 :(得分:1)
对于您的问题的技术解答是,您可以使用以下任一方法:
configuration.incoming.beforeResolve
钩子才能在最后一刻完成。afterEvaluate
块,假设所有其他依赖项都不是在afterEvaluate
本身中定义的。但是,正确的解决方案是利用Gradle的依赖性管理引擎,并有效地声明您的根项目(构建EAR的根项目)依赖于子项目的特定配置。
我不知道您的完整设置和详细信息,尽管您可能必须从结果图中过滤子项目工件,但我相信上述方法仍将是更正确的解决方案。
在最近的Gradle版本中如何工作的想法:https://docs.gradle.org/6.2/userguide/cross_project_publications.html那里解释的大多数事情都应该在最新的5.x版本中起作用。