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

标签 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

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

前者不起作用,因为似乎在该代码运行的配置阶段,依赖项尚未配置。

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

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

最佳答案

您的问题的技术答案是您可以使用:

  • 只有当配置确实需要解析时,configuration.incoming.beforeResolve 钩子(Hook)才会在最后一刻执行此操作。
  • 使用 afterEvaluate block ,假设所有其他依赖项afterEvaluate 本身中定义。

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

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

关于在最近的 Gradle 版本中如何工作的想法:https://docs.gradle.org/6.2/userguide/cross_project_publications.html那里解释的大部分内容应该适用于最新的 5.x 版本。

关于java - Gradle:将子项目的依赖项添加为根项目的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60265406/

相关文章:

java - 传递 servlet 值列表

java - JPA [Eclipselink] - 如何刷新创建的动态实体的元数据?

c++ - 头文件顺序

python - 如何将 python 依赖项添加到 heroku Node 服务器?

java - Eclipse 无法解析 LWJGL 引用 (.jar)

java - 在 AWS Lambda Authorizer 中访问 URL 路径

java - 提高 Java 程序的性能

java - 无法运行 ./gradlew connectedInstrumentTest

android - 将项目移至Android Studio后找不到Sherlock主题

maven - Gradle/Maven项目fork提供了原始 Artifact (仅下载fork)