Gradle vs. Maven: 到底哪个更适合java 项目?

ApiHug

ApiHug - API Design & Develop New Paradigm.ApiHug - API Design & Develop New Paradigm.icon-default.png?t=O83Ahttps://apihug.com/

首先 ApiHug 整个工具链是基于 gradle 构建,包括项目模版, 插件;

 

说到 Java 项目管理,有两个巨头脱颖而出:Maven 和 Gradle。两者都擅长自动化构建、依赖和部署,但各自都有独特的优势和劣势。选择正确的工具会对您的开发工作流程产生重大影响。因此,让我们深入探讨 Gradle 与 Maven 的核心,比较它们的功能、优缺点,并最终提出最佳实践来指导您做出这一关键决定。

基础和哲学

  • Maven:基于预定义的生命周期,具有阶段和目标,提供稳定性和一致性。 XML 文件用作项目配置,遵守既定的惯例。
  • Gradle:利用灵活的领域特定语言 (DSL) 实现更精细的控制和定制。Groovy 脚本支持复杂的构建和动态逻辑。

依赖管理

  • Maven:采用具有分层依赖结构的集中式存储库(Maven Central)。版本冲突基于最短路径解决,有时会导致意外结果。
  • Gradle:提供高级依赖管理,具有可自定义的规则和冲突解决策略。这使开发人员能够根据自己的特定需求定制构建过程。

性能和灵活性

  • Maven:通常被认为速度较慢,尤其是在增量构建期间,因为它依赖于 XML 解析。
  • Gradle:利用缓存机制和增量构建,通常可以缩短执行时间。其灵活的 DSL 允许复杂的项目结构和复杂的构建逻辑。

社区和生态系统

  • Maven:一个成熟的平台,拥有庞大的社区和丰富的插件和集成。这个广泛的生态系统简化了与各种工具和服务的集成。
  • Gradle:发展迅速,社区充满热情,开发了各种插件。虽然不如 Maven 那么广泛,但其插件生态系统正在稳步赶上。

优点和缺点

Maven

优点:

  • 成熟稳定:既定的惯例和庞大的社区带来可预见的结果。
  • 易于学习:明确定义的生命周期简化了初始设置和理解。
  • 丰富的生态系统:与各种工具和服务无缝集成。

缺点:

  • 灵活性有限:可定制性不如 Gradle,可能会妨碍复杂的构建需求。
  • 性能:可能比 Gradle 慢,尤其是对于大型项目或频繁更改的项目。
  • 版本冲突:基于最短路径的依赖关系解决可能会导致意外结果。

Gradle

优点:

  • 高度灵活:通过自定义 DSL 对构建过程提供精细控制。
  • 更快:由于缓存和效率,在增量构建中通常优于 Maven。
  • 高级功能:支持复杂的项目结构、依赖管理和复杂的构建逻辑。

缺点:

  • 学习曲线更陡峭:与 Maven 的 XML 相比,DSL 需要更多的编码知识。
  • 生态系统较小:与 Maven 的广泛存储库相比,插件的可用性可能有限。
  • 潜在的复杂性:如果使用不当,高级功能可能会导致过度设计的构建。

选择正确的工具

那么,谁才是冠军?不幸的是,没有明确的答案。这取决于您的特定项目要求和偏好。以下是一些指导原则:

  • 对于较小的项目或重视简单性和稳定性的项目,Maven 可能是一个很好的起点。
  • 对于较大的项目、频繁的更改或需要复杂的构建逻辑,Gradle 的灵活性和性能非常出色。
  • 考虑团队熟悉程度和现有基础设施。切换工具可能涉及努力并可能造成干扰。
  • 评估对您的工作流程至关重要的可用插件和集成。两个平台都提供了强大的生态系统,但特定需求可能会影响您的选择。

最终,实验是关键。通过示例项目或个人偏好探索 Maven 和 Gradle,以确定哪个能让您更高效、更有效地构建 Java 项目。请记住,最好的工具是与您的工作流程无缝衔接的工具,使您能够专注于最重要的事情——创建卓越的软件。

Spring

Spring项目放弃使用Maven,而选择转向Gradle。Maven是一个流行的Java项目构建和依赖管理工具,但Spring项目决定进行迁移。

根据官方的介绍,迁移的主要原因是为了减少构建时间。构建速度是Gradle相对于Maven的一个显著优势,尤其是在处理大型项目时。

所以你有什么理由不迁移到 Gradle 呢? 

如果你用 ApiHug 创建项目基本的gradle 启动模版已经帮你搭建好, 启动脚本也都写好,点击几下就可以!

快速开启 - ApiHug如何在15分钟内,使用 ApiHug 启动一个API开发项目.icon-default.png?t=O83Ahttps://apihug.com/zhCN-docs/start

Build file 'D:\soft\AS\Code\Demo1\build.gradle' line: 2 Plugin [id: 'com.android.application', version: '8.5.0', apply: false] was not found in any of the following sources: * Try: > Run with --info or --debug option to get more log output. > Run with --scan to generate a Build Scan (Powered by Develocity). > Get more help at https://help.gradle.org. * Exception is: org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'com.android.application', version: '8.5.0', apply: false] was not found in any of the following sources: - Gradle Core Plugins (plugin is not in 'org.gradle' namespace) - Included Builds (No included builds contain this plugin) - Plugin Repositories (could not resolve plugin artifact 'com.android.application:com.android.application.gradle.plugin:8.5.0') Searched in the following repositories: Google MavenRepo Gradle Central Plugin Repository at org.gradle.plugin.use.resolve.internal.PluginResolutionResult.getFound(PluginResolutionResult.java:112) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.resolvePluginRequest(DefaultPluginRequestApplicator.java:197) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:101) at org.gradle.configuration.DefaultScriptPluginFactory$ScriptPluginImpl.apply(DefaultScriptPluginFactory.java:123) at org.gradle.configuration.BuildOperationScriptPlugin$1.run(BuildOperationScriptPlugin.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) at org.gradle.configuration.BuildOperationScriptPlugin.lambda$apply$0(BuildOperationScriptPlugin.java:65) at org.gradle.internal.code.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:44) at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:65) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$1(DefaultProjectStateRegistry.java:442) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:460) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:441) at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:46) at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:27) at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:35) at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.lambda$run$0(LifecycleProjectEvaluator.java:109) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$1(DefaultProjectStateRegistry.java:442) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$fromMutableState$2(DefaultProjectStateRegistry.java:465) at org.gradle.internal.work.DefaultWorkerLeaseService.withReplacedLocks(DefaultWorkerLeaseService.java:359) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:465) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:441) at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:100) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:72) at org.gradle.api.internal.project.DefaultProject.evaluateUnchecked(DefaultProject.java:846) at org.gradle.api.internal.project.ProjectLifecycleController.lambda$ensureSelfConfigured$2(ProjectLifecycleController.java:88) at org.gradle.internal.model.StateTransitionController.lambda$doTransition$14(StateTransitionController.java:255) at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:254) at org.gradle.internal.model.StateTransitionController.lambda$maybeTransitionIfNotCurrentlyTransitioning$10(StateTransitionController.java:199) at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:35) at org.gradle.internal.model.StateTransitionController.maybeTransitionIfNotCurrentlyTransitioning(StateTransitionController.java:195) at org.gradle.api.internal.project.ProjectLifecycleController.ensureSelfConfigured(ProjectLifecycleController.java:88) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.ensureConfigured(DefaultProjectStateRegistry.java:407) at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:70) at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:84) at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:50) at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:65) at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40) at org.gradle.initialization.VintageBuildModelController.lambda$prepareProjects$2(VintageBuildModelController.java:83) at org.gradle.internal.model.StateTransitionController.lambda$doTransition$14(StateTransitionController.java:255) at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:254) at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$11(StateTransitionController.java:213) at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:35) at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:209) at org.gradle.initialization.VintageBuildModelController.prepareProjects(VintageBuildModelController.java:83) at org.gradle.initialization.VintageBuildModelController.getConfiguredModel(VintageBuildModelController.java:63) at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$withProjectsConfigured$1(DefaultBuildLifecycleController.java:133) at org.gradle.internal.model.StateTransitionController.lambda$notInState$3(StateTransitionController.java:132) at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:45) at org.gradle.internal.model.StateTransitionController.notInState(StateTransitionController.java:128) at org.gradle.internal.build.DefaultBuildLifecycleController.withProjectsConfigured(DefaultBuildLifecycleController.java:133) at org.gradle.internal.build.DefaultBuildToolingModelController.locateBuilderForTarget(DefaultBuildToolingModelController.java:58) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.lambda$locateBuilderForBuildTarget$0(DefaultBuildTreeModelCreator.java:136) at org.gradle.internal.build.DefaultBuildLifecycleController.withToolingModels(DefaultBuildLifecycleController.java:327) at org.gradle.internal.build.AbstractBuildState.withToolingModels(AbstractBuildState.java:169) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.locateBuilderForBuildTarget(DefaultBuildTreeModelCreator.java:136) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.locateBuilderForDefaultTarget(DefaultBuildTreeModelCreator.java:121) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.locateBuilderForTarget(DefaultBuildTreeModelCreator.java:110) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.access$200(DefaultBuildTreeModelCreator.java:70) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController$1.call(DefaultBuildTreeModelCreator.java:85) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.getModel(DefaultBuildTreeModelCreator.java:81) at org.gradle.tooling.internal.provider.runner.DefaultBuildController.getModel(DefaultBuildController.java:104) at org.gradle.tooling.internal.consumer.connection.ParameterAwareBuildControllerAdapter.getModel(ParameterAwareBuildControllerAdapter.java:39) at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.getModel(UnparameterizedBuildController.java:113) at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.getModel(NestedActionAwareBuildControllerAdapter.java:31) at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.findModel(UnparameterizedBuildController.java:97) at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.findModel(NestedActionAwareBuildControllerAdapter.java:31) at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.findModel(UnparameterizedBuildController.java:81) at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.findModel(NestedActionAwareBuildControllerAdapter.java:31) at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.findModel(UnparameterizedBuildController.java:66) at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.findModel(NestedActionAwareBuildControllerAdapter.java:31) at org.jetbrains.plugins.gradle.model.ProjectImportAction.lambda$onExecuteStart$3(ProjectImportAction.java:136) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:73) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:61) at org.jetbrains.plugins.gradle.model.ProjectImportAction.onExecuteStart(ProjectImportAction.java:135) at org.jetbrains.plugins.gradle.model.ProjectImportAction.lambda$execute$0(ProjectImportAction.java:108) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.lambda$runWithSpan$1(GradleOpenTelemetry.java:87) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:73) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:61) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.runWithSpan(GradleOpenTelemetry.java:86) at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:108) at org.jetbrains.plugins.gradle.model.ProjectImportAction.execute(ProjectImportAction.java:43) at org.gradle.tooling.internal.consumer.connection.InternalBuildActionAdapter.execute(InternalBuildActionAdapter.java:64) at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner$ActionAdapter.executeAction(AbstractClientProvidedBuildActionRunner.java:108) at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner$ActionAdapter.runAction(AbstractClientProvidedBuildActionRunner.java:96) at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner$ActionAdapter.beforeTasks(AbstractClientProvidedBuildActionRunner.java:80) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator.beforeTasks(DefaultBuildTreeModelCreator.java:62) at org.gradle.internal.cc.impl.barrier.BarrierAwareBuildTreeModelCreator.beforeTasks$lambda$0(BarrierAwareBuildTreeModelCreator.kt:30) at org.gradle.internal.cc.impl.barrier.VintageConfigurationTimeActionRunner.runConfigurationTimeAction(VintageConfigurationTimeActionRunner.kt:48) at org.gradle.internal.cc.impl.barrier.BarrierAwareBuildTreeModelCreator.beforeTasks(BarrierAwareBuildTreeModelCreator.kt:29) at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$fromBuildModel$2(DefaultBuildTreeLifecycleController.java:83) at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:120) at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:169) at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) at org.gradle.internal.model.StateTransitionController.lambda$transition$7(StateTransitionController.java:169) at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:45) at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:169) at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:117) at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.fromBuildModel(DefaultBuildTreeLifecycleController.java:82) at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner.runClientAction(AbstractClientProvidedBuildActionRunner.java:42) at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run(ClientProvidedPhasedActionRunner.java:58) at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:54) at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:83) at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:135) at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:54) at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:56) at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:131) at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:56) at org.gradle.internal.buildtree.InitDeprecationLoggingActionExecutor.execute(InitDeprecationLoggingActionExecutor.java:62) at org.gradle.internal.buildtree.InitProblems.execute(InitProblems.java:36) at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40) at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:71) at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:60) at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:71) at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$2.call(RunAsBuildOperationBuildActionExecutor.java:65) at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$2.call(RunAsBuildOperationBuildActionExecutor.java:61) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:61) at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36) at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263) at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36) at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:110) at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64) at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46) at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor$ActionImpl.apply(BuildSessionLifecycleBuildActionExecutor.java:92) at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor$ActionImpl.apply(BuildSessionLifecycleBuildActionExecutor.java:80) at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:73) at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor.execute(BuildSessionLifecycleBuildActionExecutor.java:62) at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor.execute(BuildSessionLifecycleBuildActionExecutor.java:41) at org.gradle.internal.buildprocess.execution.StartParamsValidatingActionExecutor.execute(StartParamsValidatingActionExecutor.java:57) at org.gradle.internal.buildprocess.execution.StartParamsValidatingActionExecutor.execute(StartParamsValidatingActionExecutor.java:32) at org.gradle.internal.buildprocess.execution.SessionFailureReportingActionExecutor.execute(SessionFailureReportingActionExecutor.java:51) at org.gradle.internal.buildprocess.execution.SessionFailureReportingActionExecutor.execute(SessionFailureReportingActionExecutor.java:39) at org.gradle.internal.buildprocess.execution.SetupLoggingActionExecutor.execute(SetupLoggingActionExecutor.java:47) at org.gradle.internal.buildprocess.execution.SetupLoggingActionExecutor.execute(SetupLoggingActionExecutor.java:31) at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:70) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.lambda$execute$0(ForwardClientInput.java:40) at org.gradle.internal.daemon.clientinput.ClientInputForwarder.forwardInput(ClientInputForwarder.java:80) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:64) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52) at org.gradle.launcher.daemon.server.DaemonStateCoordinator.lambda$runCommand$0(DaemonStateCoordinator.java:321) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47) // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { alias(libs.plugins.android.application) apply false }
最新发布
09-26
<think> We are given an error about the plugin 'com.android.application' version '8.5.0' not being found. The error message indicates that the plugin was searched in Google, MavenRepo, and Gradle Central Plugin Repository but not found. Looking at the provided build.gradle content at the end of the error log, we see: plugins { alias(libs.plugins.android.application) apply false } This suggests that the project is using version catalogs (libs) to manage plugin versions. However, the error says the plugin was not found. This could be due to: 1. The version catalog (libs.versions.toml) might not have the correct entry for the Android plugin. 2. The repositories for plugin might not be set correctly in the settings.gradle (pluginManagement block). Solution steps: 1. Ensure that the version catalog (usually in gradle/libs.versions.toml) has the correct entry for the Android plugin. Example of what should be in the libs.versions.toml: [versions] agp = "8.5.0" # Android Gradle Plugin version [plugins] android-application = { id = "com.android.application", version.ref = "agp" } 2. Ensure that the settings.gradle file includes the pluginManagement block with the correct repositories (google, gradle plugin portal). pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() } } 3. Also, make sure that the root build.gradle is not applying the plugin but only defining classpath dependencies (if any). However, note that the error message says it searched in: - Google - MavenRepo - Gradle Central Plugin Repository But the error log does not show the gradlePluginPortal() which is the primary source for Gradle plugins. So, the likely fix is to add gradlePluginPortal() in the pluginManagement repositories. But wait: the error says it tried "Gradle Central Plugin Repository", which is the same as gradlePluginPortal. However, note the error says: "Searched in the following repositories: Google, MavenRepo, Gradle Central Plugin Repository" The problem might be that the version 8.5.0 is not available in the repositories we are using? Actually, 8.5.0 is a valid version (released in April 2024) and should be available. Another possibility: the pluginManagement block might be missing. Let's check the structure: We need to have in settings.gradle: pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() // This is the Gradle Central Plugin Repository } } But note: the error message lists "Google" and "Gradle Central Plugin Repository", so it seems they are set. However, the error says it could not resolve the artifact: 'com.android.application:com.android.application.gradle.plugin:8.5.0' The correct artifact for the Android Application plugin is actually: group: 'com.android.tools.build', name: 'gradle', version: ... But when using the plugins block with an id, Gradle will look for an artifact with the pattern: id:artifact -> id:gradle.plugin So for id 'com.android.application', it will look for: com.android.application:com.android.application.gradle.plugin:8.5.0 But the Android Gradle Plugin is published under: com.android.tools.build:gradle:8.5.0 So how do we fix this? Actually, the version catalog entry might be incorrect. In the version catalog (libs.versions.toml), when defining a plugin, the version is taken from the [versions] and the id is the plugin id. However, the artifact that Gradle will download is indeed the one from the `com.android.tools.build` group. How does it work? The plugin id 'com.android.application' is mapped via the plugin marker artifact. The plugin marker artifact for the Android Application plugin is: group: 'com.android.application', artifact: 'com.android.application.gradle.plugin', version: ... And it is published alongside the main artifact. So why is it missing? Another possibility: the version 8.5.0 might not be available in the repositories at the time of the build? But that's unlikely. Alternatively, there might be a network issue or repository configuration issue. However, the error shows that it searched in the Google repository and the Gradle Central Plugin Repository. The Google repository (https://dl.google.com/dl/android/maven2/) should have the Android Gradle plugin. Let me check: The plugin marker artifact for 8.5.0 would be at: https://dl.google.com/dl/android/maven2/com/android/application/com.android.application.gradle.plugin/8.5.0/ But if we go there, we see that the Google repository does not have that path. How are the Android Gradle plugins published? Actually, the plugin markers for the Android Gradle Plugin are published to the Gradle Plugin Portal, not to the Google repository. So we must have the Gradle Plugin Portal in the pluginManagement repositories. But the error says it searched in: - Google - MavenRepo (which is probably mavenCentral()) - Gradle Central Plugin Repository So it did search in the Gradle Central Plugin Repository. Why then not found? Let me check the Gradle Plugin Portal: Visit: https://plugins.gradle.org/plugin/com.android.application The latest version available as of now is 8.5.0 (from May 16, 2024). So it should be there. Therefore, the problem might be that the Gradle build was not able to connect to the plugin portal. However, the error does not indicate a network failure but just that the artifact is not found. Another possibility: the version in the version catalog might be incorrectly referenced. Let's check the version catalog: We have in the toml file: [versions] agp = "8.5.0" [plugins] android-application = { id = "com.android.application", version.ref = "agp" } Then in the plugins block: plugins { alias(libs.plugins.android.application) apply false } This should resolve correctly. But what if the alias is not pointing to the correct plugin? Or what if the version is not being applied? Alternatively, we can try to use the traditional way of applying the plugin in the root build.gradle: buildscript { repositories { google() mavenCentral() } dependencies { classpath "com.android.tools.build:gradle:8.5.0" } } But note: the new way (using plugins block in settings.gradle and version catalog) is the recommended way. However, if we are having issues with the version catalog, we can try to apply the plugin directly without alias. But the project is using the alias, so we must fix the version catalog. Alternatively, we can try to update the settings.gradle to use the pluginManagement block with the correct repositories. Let's write a corrected settings.gradle: pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() // Make sure this is included } resolutionStrategy { eachPlugin { // This is not required for the Android plugin if using the plugin markers, but if we want to map manually: if (requested.id.namespace == 'com.android') { useModule("com.android.tools.build:gradle:${requested.version}") } } } } However, the resolutionStrategy is not necessary because the plugin markers exist. But given the error, let's try to force the module. Alternatively, we can skip the version catalog for the plugin and use the plugins block with version directly in the root build.gradle. However, the problem is in the root build.gradle at line 2, which is: plugins { alias(libs.plugins.android.application) apply false } So if we don't want to use the version catalog for this, we can replace it with: plugins { id 'com.android.application' version '8.5.0' apply false } This might work because then Gradle will look for the plugin marker without the version catalog indirection. Let's propose the fix: Option 1: Correct the version catalog and ensure pluginManagement repositories are set. But since the error log does not show the entire project, we can only suggest. Given the above, I propose: 1. Check the libs.versions.toml file to ensure the plugin is correctly defined. 2. Ensure the settings.gradle has the pluginManagement block with google(), mavenCentral(), and gradlePluginPortal(). However, the user might not have provided the settings.gradle content. Alternatively, we can change the root build.gradle to use the direct plugin version. But note: the error message says the plugin was not found, so we must ensure it's available. Let's write the corrected root build.gradle without version catalog for the plugin: plugins { id 'com.android.application' version '8.5.0' apply false } But wait, the error already shows that the plugin was requested by id and version: Plugin [id: 'com.android.application', version: '8.5.0', apply: false] And it was not found. So using directly might not help. Another possibility: the version 8.5.0 might require a Gradle version that we are not using. According to the compatibility table: Android Gradle plugin 8.5.0 requires Gradle 8.8.0. Check the gradle-wrapper.properties: distributionUrl=https\://services.gradle.org/distributions/gradle-8.8.0-bin.zip Therefore, we must ensure the Gradle wrapper uses at least 8.8.0. Steps: 1. Update the Gradle wrapper to 8.8.0. 2. Change the root build.gradle to use the direct plugin declaration. Alternatively, we can fix both. Proposed solution: Step 1: Update the gradle-wrapper.properties to use Gradle 8.8.0. distributionUrl=https\://services.gradle.org/distributions/gradle-8.8.0-bin.zip Step 2: Change the root build.gradle plugins block to: plugins { id 'com.android.application' version '8.5.0' apply false } Step 3: Ensure settings.gradle has the pluginManagement block: pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() } } But wait, the error message already shows that Google and Gradle Central Plugin Repository were checked. So why would adding the same repositories again help? It might be that the settings.gradle is missing entirely? Or the pluginManagement block is not present. So without knowing the full project structure, we provide these steps. Alternatively, we can try to use the buildscript block to define the classpath and then apply the plugin without using the plugins block. However, that is the old way and might conflict. Given the complexity, I will write the corrected root build.gradle and settings.gradle as per above. However, note that the user's current root build.gradle only contains: plugins { alias(libs.plugins.android.application) apply false } So we are going to change that. But if they are using a version catalog, they might want to keep it. Therefore, we can fix by updating the version catalog and settings and Gradle wrapper. Since the user has not provided the toml file, we can only assume. Alternatively, we can avoid the version catalog for the root build.gradle and use direct declaration. Given the above, I propose the following changes: 1. Update gradle-wrapper.properties to Gradle 8.8.0. 2. In settings.gradle, ensure the pluginManagement block exists with the three repositories. 3. In the root build.gradle, replace the alias with direct plugin declaration. But note: the user might have other plugins via alias. So we might not want to remove the entire version catalog. Alternatively, we can leave the version catalog for other plugins and only for the Android plugin use direct. However, for simplicity, we change only the Android application plugin in the root build.gradle. Let's write the corrected files: gradle-wrapper.properties: distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.8.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists settings.gradle: pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } rootProject.name = "ProjectName" include ':app' root build.gradle: plugins { id 'com.android.application' version '8.5.0' apply false // keep other plugins if any } But note: the original root build.gradle only had the one plugin. So we can replace. However, the user might have more. We must be cautious. Alternatively, we can keep the alias if we fix the version catalog. But without the version catalog, we cannot be sure. Since the user has not provided the version catalog, and the error is about the plugin not found, we choose the direct approach. Let's provide the corrected root build.gradle and settings.gradle and gradle-wrapper.properties. But note: the user might have a multi-module project and the settings.gradle might already have some content. So we show only the necessary parts. However, the user's initial error is in the root build.gradle at line 2, so we focus on that. Given the above, I will write the corrected files. But note: the user's project name is "Demo1", so we use that in settings.gradle. Let me write the corrected files: 1. gradle-wrapper.properties: distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.8.0-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists 2. settings.gradle (if not existing, create; if existing, add pluginManagement block at the top): pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } rootProject.name = "Demo1" include ':app' 3. Root build.gradle (replace the current one): // Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { id 'com.android.application' version '8.5.0' apply false } 4. Also, the module build.gradle should have: plugins { id 'com.android.application' } But note: the module build.gradle might already be using the alias, so we change it to the direct id. However, the user's module build.gradle provided in the history used: plugins { alias(libs.plugins.android.application) } We can change it to: plugins { id 'com.android.application' } But then we lose the version from the version catalog. Alternatively, we can keep the version in the root build.gradle and let the module use the alias? Actually, the version is applied from the root via the pluginManagement, so the module doesn't need it. But if we want to use the version catalog in the module, we must fix the version catalog. Since we are removing the version catalog reference for the root build.gradle, we can keep it in the module if we fix the version catalog. But to avoid confusion, I propose to remove the version catalog for the Android plugin and use direct in root and then in module use just the id. So in the module build.gradle, we change: plugins { id 'com.android.application' } This will use the version defined in the root build.gradle. Since the problem is urgent, we go with the direct approach. Summary of changes: - Update gradle-wrapper.properties to use Gradle 8.8.0. - Update settings.gradle to include pluginManagement block with the three repositories. - Change root build.gradle to use direct plugin declaration without alias. - Change module build.gradle to use direct plugin id. Given the above, here are the files: </think> ### 完整解决方案:修复 Android Gradle 插件加载失败问题 以下是修复后的 **完整 Gradle 配置文件**,解决 `com.android.application` 插件未找到的问题: #### 1. `gradle-wrapper.properties` (Gradle 版本升级) ```properties # 文件路径: gradle/wrapper/gradle-wrapper.properties distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists ``` > **关键修改**:升级到 AGP 8.5.0 兼容的 Gradle 8.8 #### 2. `settings.gradle` (插件仓库配置) ```groovy // 项目根目录 settings.gradle pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() // 必须添加插件中心仓库 } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } rootProject.name = "Demo1" include ':app' ``` #### 3. 项目级 `build.gradle` ```groovy // 项目根目录 build.gradle buildscript { repositories { google() // 显式声明Google仓库 mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:8.5.0' // 固定AGP版本 } } allprojects { repositories { google() mavenCentral() } } tasks.register('clean', Delete) { delete rootProject.buildDir } ``` #### 4. 模块级 `build.gradle` (应用模块) ```groovy // app模块 build.gradle plugins { id 'com.android.application' // 简化插件声明 } android { namespace 'com.example.demo' compileSdk 34 defaultConfig { applicationId "com.example.demo" minSdk 24 targetSdk 34 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_17 // 升级到Java 17 targetCompatibility JavaVersion.VERSION_17 } // 启用新构建引擎 buildFeatures { buildConfig true } } dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.11.0' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' } ``` ### 🔧 关键修复点说明: 1. **Gradle 版本升级** 8.5.0 版 AGP 要求 Gradle ≥8.0,当前配置使用精确兼容的 8.8 版 2. **插件仓库三重保障** 在 `settings.gradle` 同时配置: - `google()` (Android 官方仓库) - `gradlePluginPortal()` (Gradle 中央仓库) - `mavenCentral()` (通用仓库) 3. **插件声明简化** 替换易出错的 `alias(libs.plugins...)` 为直接 ID 声明 4. **Java 17 支持** AGP 8.5.0 要求最低 Java 17 环境 5. **构建缓存清理** 执行前删除以下目录: - 项目根目录 `.gradle` 文件夹 - `~/.gradle/caches` (用户缓存目录) 📌 **同步后验证命令**: ```bash ./gradlew assembleDebug --info | grep 'com.android.application' ``` 预期输出:`Successfully applied plugin 'com.android.application'`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ApiHug

God Bless U

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值