Adaptable, fast automation for all

Overview

Gradle Logo

Revved up by Gradle Enterprise

Gradle is a build tool with a focus on build automation and support for multi-language development. If you are building, testing, publishing, and deploying software on any platform, Gradle offers a flexible model that can support the entire development lifecycle from compiling and packaging code to publishing web sites. Gradle has been designed to support build automation across multiple languages and platforms including Java, Scala, Android, Kotlin, C/C++, and Groovy, and is closely integrated with development tools and continuous integration servers including Eclipse, IntelliJ, and Jenkins.

For more information, please visit the official project homepage

Getting Started

Stay in Flow

Enjoy first-class Gradle support in your IDE of choice.

Need Help?

Contributing

If you're looking to contribute to Gradle or provide a patch/pull request, you can find more info here.

This project adheres to the Gradle Code of Conduct. By participating, you are expected to uphold this code.

Comments
  • JDK 14 support

    JDK 14 support

    Expected Behavior

    gradle should run with the latest JDK 14 ea.

    Current Behavior

    gradle -version works, but running any gradle task, including gradle tasks will throw an exception right away.

    Context

    Trying to do a build using the latest version of gradle.

    Steps to Reproduce

    1. Download the latest JDK 14 EA build from http://jdk.java.net/14/
    2. Set your PATH and JAVA_HOME variables to point to jdk-14
    3. Run gradle -version -- that correctly prints:
    ------------------------------------------------------------
    Gradle 5.5.1
    ------------------------------------------------------------
    
    Build time:   2019-07-10 20:38:12 UTC
    Revision:     3245f748c7061472da4dc184991919810f7935a5
    
    Kotlin:       1.3.31
    Groovy:       2.5.4
    Ant:          Apache Ant(TM) version 1.9.14 compiled on March 12 2019
    JVM:          14-ea (Oracle Corporation 14-ea+9-288)
    OS:           Linux 4.4.0-157-generic amd64
    
    1. Now run gradle tasks (it doesn't matter what is in your build.gradle file or whether you even have one) -- it will fail with the following exception:
    java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
            at org.codehaus.groovy.vmplugin.VMPluginFactory.<clinit>(VMPluginFactory.java:43)
            at org.codehaus.groovy.reflection.GroovyClassValueFactory.<clinit>(GroovyClassValueFactory.java:35)
            at org.codehaus.groovy.reflection.ClassInfo.<clinit>(ClassInfo.java:109)
            at org.codehaus.groovy.reflection.ReflectionCache.getCachedClass(ReflectionCache.java:95)
            at org.codehaus.groovy.reflection.ReflectionCache.<clinit>(ReflectionCache.java:39)
            at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.registerMethods(MetaClassRegistryImpl.java:209)
            at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:107)
            at org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.<init>(MetaClassRegistryImpl.java:85)
            at groovy.lang.GroovySystem.<clinit>(GroovySystem.java:36)
            at org.codehaus.groovy.runtime.InvokerHelper.<clinit>(InvokerHelper.java:86)
            at groovy.lang.GroovyObjectSupport.getDefaultMetaClass(GroovyObjectSupport.java:59)
            at groovy.lang.GroovyObjectSupport.<init>(GroovyObjectSupport.java:32)
            at org.gradle.internal.extensibility.DefaultExtraPropertiesExtension.<init>(DefaultExtraPropertiesExtension.java:29)
            at org.gradle.internal.extensibility.DefaultConvention.<init>(DefaultConvention.java:48)
            at org.gradle.api.internal.plugins.DefaultConvention.<init>(DefaultConvention.java:28)
            at org.gradle.internal.extensibility.ExtensibleDynamicObject.<init>(ExtensibleDynamicObject.java:60)
            at org.gradle.internal.instantiation.MixInExtensibleDynamicObject.<init>(MixInExtensibleDynamicObject.java:34)
            at org.gradle.initialization.DefaultSettings_Decorated.getAsDynamicObject(Unknown Source)
            at org.gradle.initialization.SettingsFactory.createSettings(SettingsFactory.java:58)
            at org.gradle.initialization.ScriptEvaluatingSettingsProcessor.process(ScriptEvaluatingSettingsProcessor.java:60)
            at org.gradle.initialization.PropertiesLoadingSettingsProcessor.process(PropertiesLoadingSettingsProcessor.java:37)
            at org.gradle.initialization.SettingsEvaluatedCallbackFiringSettingsProcessor.process(SettingsEvaluatedCallbackFiringSettingsProcessor.java:34)
            at org.gradle.initialization.RootBuildCacheControllerSettingsProcessor.process(RootBuildCacheControllerSettingsProcessor.java:36)
            at org.gradle.initialization.BuildOperationSettingsProcessor$2.call(BuildOperationSettingsProcessor.java:50)
            at org.gradle.initialization.BuildOperationSettingsProcessor$2.call(BuildOperationSettingsProcessor.java:47)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
            at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
            at org.gradle.initialization.BuildOperationSettingsProcessor.process(BuildOperationSettingsProcessor.java:47)
            at org.gradle.initialization.DefaultSettingsLoader.findSettingsAndLoadIfAppropriate(DefaultSettingsLoader.java:104)
            at org.gradle.initialization.DefaultSettingsLoader.findAndLoadSettings(DefaultSettingsLoader.java:45)
            at org.gradle.initialization.SettingsAttachingSettingsLoader.findAndLoadSettings(SettingsAttachingSettingsLoader.java:35)
            at org.gradle.internal.composite.ChildBuildRegisteringSettingsLoader.findAndLoadSettings(ChildBuildRegisteringSettingsLoader.java:47)
            at org.gradle.initialization.DefaultSettingsPreparer.prepareSettings(DefaultSettingsPreparer.java:36)
            at org.gradle.initialization.NotifyingSettingsPreparer$LoadBuild.doLoadBuild(NotifyingSettingsPreparer.java:59)
            at org.gradle.initialization.NotifyingSettingsPreparer$LoadBuild.run(NotifyingSettingsPreparer.java:54)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
            at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
            at org.gradle.initialization.NotifyingSettingsPreparer.prepareSettings(NotifyingSettingsPreparer.java:42)
            at org.gradle.initialization.DefaultGradleLauncher.prepareSettings(DefaultGradleLauncher.java:189)
            at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:133)
            at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:125)
            at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:105)
            at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:58)
            at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:55)
            at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:82)
            at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:75)
            at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:183)
            at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
            at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:75)
            at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:55)
            at org.gradle.initialization.buildsrc.BuildSrcUpdateFactory.build(BuildSrcUpdateFactory.java:55)
            at org.gradle.initialization.buildsrc.BuildSrcUpdateFactory.create(BuildSrcUpdateFactory.java:45)
            at org.gradle.initialization.buildsrc.BuildSourceBuilder$3.transform(BuildSourceBuilder.java:124)
            at org.gradle.initialization.buildsrc.BuildSourceBuilder$3.transform(BuildSourceBuilder.java:118)
            at org.gradle.composite.internal.DefaultNestedBuild.run(DefaultNestedBuild.java:73)
            at org.gradle.initialization.buildsrc.BuildSourceBuilder.buildBuildSrc(BuildSourceBuilder.java:118)
            at org.gradle.initialization.buildsrc.BuildSourceBuilder.access$000(BuildSourceBuilder.java:45)
            at org.gradle.initialization.buildsrc.BuildSourceBuilder$2.call(BuildSourceBuilder.java:96)
            at org.gradle.initialization.buildsrc.BuildSourceBuilder$2.call(BuildSourceBuilder.java:93)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
            at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
            at org.gradle.initialization.buildsrc.BuildSourceBuilder.createBuildSourceClasspath(BuildSourceBuilder.java:93)
            at org.gradle.initialization.buildsrc.BuildSourceBuilder.buildAndCreateClassLoader(BuildSourceBuilder.java:73)
            at org.gradle.initialization.DefaultSettingsLoader.findSettingsAndLoadIfAppropriate(DefaultSettingsLoader.java:102)
            at org.gradle.initialization.DefaultSettingsLoader.findAndLoadSettings(DefaultSettingsLoader.java:45)
            at org.gradle.initialization.SettingsAttachingSettingsLoader.findAndLoadSettings(SettingsAttachingSettingsLoader.java:35)
            at org.gradle.internal.composite.CommandLineIncludedBuildSettingsLoader.findAndLoadSettings(CommandLineIncludedBuildSettingsLoader.java:34)
            at org.gradle.internal.composite.ChildBuildRegisteringSettingsLoader.findAndLoadSettings(ChildBuildRegisteringSettingsLoader.java:47)
            at org.gradle.internal.composite.CompositeBuildSettingsLoader.findAndLoadSettings(CompositeBuildSettingsLoader.java:35)
            at org.gradle.initialization.DefaultSettingsPreparer.prepareSettings(DefaultSettingsPreparer.java:36)
            at org.gradle.initialization.NotifyingSettingsPreparer$LoadBuild.doLoadBuild(NotifyingSettingsPreparer.java:59)
            at org.gradle.initialization.NotifyingSettingsPreparer$LoadBuild.run(NotifyingSettingsPreparer.java:54)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
            at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
            at org.gradle.initialization.NotifyingSettingsPreparer.prepareSettings(NotifyingSettingsPreparer.java:42)
            at org.gradle.initialization.DefaultGradleLauncher.prepareSettings(DefaultGradleLauncher.java:189)
            at org.gradle.initialization.DefaultGradleLauncher.doClassicBuildStages(DefaultGradleLauncher.java:133)
            at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:125)
            at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:105)
            at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:58)
            at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:55)
            at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:82)
            at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:75)
            at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:183)
            at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
            at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:75)
            at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:55)
            at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:31)
            at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
            at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:58)
            at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
            at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:39)
            at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:51)
            at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:45)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
            at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
            at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
            at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
            at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:49)
            at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:46)
            at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:78)
            at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:46)
            at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31)
            at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42)
            at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28)
            at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
            at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52)
            at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:59)
            at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:36)
            at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68)
            at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38)
            at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37)
            at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26)
            at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
            at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
            at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60)
            at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32)
            at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
            at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
            at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48)
            at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32)
            at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:55)
            at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:208)
            at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:394)
            at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:367)
            at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:37)
            at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:23)
            at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:360)
            at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:292)
            at org.gradle.launcher.Main.doAction(Main.java:36)
            at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.base/java.lang.reflect.Method.invoke(Method.java:565)
            at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:60)
            at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:37)
            at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.base/java.lang.reflect.Method.invoke(Method.java:565)
            at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:31)
            at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:108)
            at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)
    
    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Could not initialize class org.codehaus.groovy.reflection.ReflectionCache
    
    a:bug @core 
    opened by kevinrushforth 122
  • Let multiple containers share downloaded dependencies

    Let multiple containers share downloaded dependencies

    Hi!

    Looks like Gradle is locking the global cache when running the tests. We run Gradle in Docker containers, and from what I saw in the logs, it fails to acquire the lock with:

    14:09:05.981 [DEBUG] [org.gradle.cache.internal.DefaultFileLockManager] The file lock is held by a different Gradle process (pid: 1, operation: ). Will attempt to ping owner at port 39422
    

    Expected Behavior

    Gradle should release the lock when it executes the tests. Other Gradle instances are failing with:

    Timeout waiting to lock Plugin Resolution Cache (/root/.gradle/caches/3.2/plugin-resolution). It is currently in use by another Gradle instance.
    

    Current Behavior

    Gradle holds the lock

    Context

    Our CI servers are affected. Parallel builds are impossible.

    Steps to Reproduce

    I managed to reproduce it with a simple Docker-based environment: https://github.com/bsideup/gradle-lock-bug

    Docker and Docker Compose should be installed.

    $ git clone [email protected]:bsideup/gradle-lock-bug.git
    $ COMPOSE_HTTP_TIMEOUT=7200 docker-compose up --no-recreate
    

    Your Environment

    Gradle 3.2 (tried with 3.1, 3.0 and 2.12 as well) Docker

    in:dependency-management affects-version:3.2 a:feature 
    opened by bsideup 116
  • Allow the plugin DSL to expand properties as part of the version

    Allow the plugin DSL to expand properties as part of the version

    The plugin DSL that is used to load build script plugins does not currently support expanding properties, as defined e.g. as part of gradle.properties. This is a follow-up to https://discuss.gradle.org/t/how-to-use-property-for-version-when-using-a-plugin-via-id/22122.

    Expected Behavior

    Code like

    plugins {
        id 'org.jetbrains.kotlin.jvm' version "${project.properties.kotlinVersion}"
    }
    
    println "${project.properties.kotlinVersion}"
    

    should work, given that gradle.properties has kotlinVersion=1.1.1.

    Current Behavior

    The build fails with

    FAILURE: Build failed with an exception.
    
    * Where:
    Build file 'build.gradle' line: 2
    
    * What went wrong:
    Could not compile build file 'build.gradle'.
    > startup failed:
      build file 'build.gradle': 2: argument list must be exactly 1 literal non empty string
    
      See https://docs.gradle.org/3.4.1/userguide/plugins.html#sec:plugins_block for information on the plugins {} block
    
       @ line 2, column 9.
                 id 'org.jetbrains.kotlin.jvm' version "${project.properties.kotlinVersion}"
                 ^
    
      1 error
    

    Context

    I'm trying to define the Kotlin version only once for both the plugin version and the stdlib compile time dependency. Also see this forum thread.

    Steps to Reproduce (for bugs)

    Use the code from above and run gradle build.

    Your Environment

    Gradle 3.4.1 on Windows 10 64-bit, Kotlin Gradle plugin version 1.1.1.

    a:bug affects-version:3.4 @core 
    opened by sschuberth 100
  • Introduce a settings DSL for central dependency declaration

    Introduce a settings DSL for central dependency declaration

    This commit introduces a new DSL, available on Settings via the dependency resolution management block, which allows declaring aliases for dependencies and bundles of dependencies.

    dependencyResolutionManagement {
        dependenciesModel {
            alias("groovy", "org.codehaus.groovy", "groovy") {
                strictly("3.0.2")
            }
        }
    }
    

    Doing this, Gradle will automatically generate type-safe accessors which are exposed as extensions to all projects. This effectively allows sharing dependency declarations between projects.

    Said differently, this is an officially supported pattern for the various "dependency version sharing" patterns that we found in the wild:

    • declaring dependency versions in gradle.properties, then referencing the version via project.someLibraryVersion
    • creating a new class in buildSrc which contains dependency coordinates and then can be accessed in the different projects
    • creating extra properties for dependency versions at the root project
    • using external plugins like the "refresh dependencies" plugin
    • ...

    In addition to this DSL, we introduce a TOML file, which, if found under the gradle directory, will be used to source dependency aliases.

    For example, giving the following file:

    [dependencies]
    guava = { group = "com.google.guava", name = "guava", version = "27.0-jre" }
    groovy = { group = "org.codehaus.groovy", name = "groovy", version.strictly = "3.0.2" }
    

    a dependency can be added in a project using the type-safe libs extension:

    dependencies {
        api(libs.guava)
    }
    

    This file also supports bundles of dependencies, in case more than one dependency needs to be added:

    [bundles]
    groovy = ["groovy", "groovy-json"]
    

    then dependencies can be added via:

    dependencies {
       implementation(libs.groovyBundle)
    }
    

    The file is configuration-cache safe: any change to the file will invalidate the cache. But more importantly, it's build cache safe: if the aliases don't change, there's no need to rebuild the dependent scripts. This means that changing this file by changing, for example, the dependency versions, will not trigger a recompilation of build scripts like some of the approaches described above.

    The TOML file also lets you declare plugin versions:

    [plugins]
    my.awesome.plugin="1.0.2"
    

    which allows application of the plugin without version in build scripts:

    plugins {
       id 'my.awesome.plugin'
    }
    

    In addition, we also generate type-safe accessors for projects. For example:

    dependencies {
        api(project(":commons:core"))
    }
    

    can be replaced with:

    dependencies {
        api(projects.commons.core)
    }
    

    Therefore any change to project coordinates, or removals of subprojects would trigger a build script compilation error, avoiding tedious search and replace.

    Fixes #?

    Context

    Contributor Checklist

    Gradle Core Team Checklist

    • [ ] Verify design and implementation
    • [ ] Verify test coverage and CI build status
    • [ ] Verify documentation
    • [ ] Recognize contributor in release notes
    in:dependency-management 
    opened by melix 82
  • Make incremental compile efficient in the presence of Annotation Processors

    Make incremental compile efficient in the presence of Annotation Processors

    Migrated from GRADLE-3259 which had 19 votes

    Compile avoidance was introduced in Gradle 3.4 (<= Users please read this). One can improve performance somewhat by separate annotation processors from the compile classpath.

    Expected Behavior

    Incremental Java compilation should avoid full rebuild when annotation processors are present.

    Current Behavior

    Currently we fall back to a full recompile when annotation processors are used. The reason for this is that we don't know which source files they need as an input. The APT API allows processor to access other source files then the one containing the annotation being processed.

    Context

    We could instrument the compiler to find out which files the annotation processors are actually reading and use this information to run them incrementally as well.

    In cases where an annotation processor is taking the whole source tree as an input, we could warn the user (e.g. in build scans) that this is causing slower builds. Many developers might not even be aware of the trade-off between "saving time writing code" and "saving time running the build" they have to make.

    Design Spec

    Since this is a bigger feature, you can download the design spec as a PDF.

    a:feature epic 
    opened by eriwen 76
  • Gradle 7 File Watching in Alpine Docker container leads to JVM Crash

    Gradle 7 File Watching in Alpine Docker container leads to JVM Crash

    Expected Behavior

    Gradle should execute the task without crashing the JVM.

    Current Behavior

    JVM crashes.

    Context

    Automatic Gradle updates in an official Python 3 Alpine Docker container.

    Steps to Reproduce

    Execute:

    docker run \
        --entrypoint /usr/local/src/entrypoint.sh \
        --interactive \
        --rm \
        --tty \
        --volume "$(pwd):/usr/local/src" \
        --workdir /usr/local/src \
        python:3-alpine
    

    With the following content for the entrypoint.sh script:

    #!/usr/bin/env sh
    
    apk add --update gradle || exit 2
    touch settings.gradle gradle.log || exit 3
    
    gradle wrapper --debug --gradle-version 7.0 >>gradle.log 2>&1
    ./gradlew wrapper --debug --gradle-version 7.0 >>gradle.log 2>&1
    

    Logs

    Your Environment

    python:3-alpine

    a:bug @execution affects-version:7.0 
    opened by Fleshgrinder 74
  • Help popular annotation processors adopt incremental processing

    Help popular annotation processors adopt incremental processing

    Please submit PRs to update the list of annotation processors that support incremental annotation processing:

    https://github.com/gradle/gradle/blob/master/subprojects/docs/src/docs/userguide/java_plugin.adoc#state-of-support-in-popular-annotation-processors

    a:chore in:jvm-ecosystem 
    opened by oehme 70
  • Many occurrences of `NullPointerException: null value in entry: binResultsDir=null` when using cache

    Many occurrences of `NullPointerException: null value in entry: binResultsDir=null` when using cache

    Please see following exception:

    Gradle 4.1

    16:59:16 * Exception is:
    16:59:16 java.lang.NullPointerException: null value in entry: binResultsDir=null
    16:59:16 	at com.google.common.collect.CollectPreconditions.checkEntryNotNull(CollectPreconditions.java:33)
    16:59:16 	at com.google.common.collect.ImmutableMap.entryOf(ImmutableMap.java:135)
    16:59:16 	at com.google.common.collect.ImmutableMap$Builder.put(ImmutableMap.java:206)
    16:59:16 	at com.google.common.collect.ImmutableSortedMap$Builder.put(ImmutableSortedMap.java:371)
    16:59:16 	at org.gradle.api.internal.changedetection.state.CacheBackedTaskHistoryRepository$LazyTaskExecution.getOutputFilesSnapshot(CacheBackedTaskHistoryRepository.java:229)
    16:59:16 	at org.gradle.api.internal.changedetection.rules.OutputFilesTaskStateChanges.getSnapshotAfterPreviousExecution(OutputFilesTaskStateChanges.java:76)
    16:59:16 	at org.gradle.api.internal.changedetection.rules.OutputFilesTaskStateChanges.detectOverlappingOutputs(OutputFilesTaskStateChanges.java:91)
    16:59:16 	at org.gradle.api.internal.changedetection.rules.OutputFilesTaskStateChanges.<init>(OutputFilesTaskStateChanges.java:41)
    16:59:16 	at org.gradle.api.internal.changedetection.rules.TaskUpToDateState.<init>(TaskUpToDateState.java:58)
    16:59:16 	at org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.getStates(DefaultTaskArtifactStateRepository.java:192)
    16:59:16 	at org.gradle.api.internal.changedetection.changes.DefaultTaskArtifactStateRepository$TaskArtifactStateImpl.calculateCacheKey(DefaultTaskArtifactStateRepository.java:126)
    16:59:16 	at org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter.doResolve(ResolveBuildCacheKeyExecuter.java:99)
    16:59:16 	at org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter.access$000(ResolveBuildCacheKeyExecuter.java:45)
    16:59:16 	at org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter$1.run(ResolveBuildCacheKeyExecuter.java:83)
    16:59:16 	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    16:59:16 	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    16:59:16 	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
    16:59:16 	at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
    16:59:16 	at org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter.resolve(ResolveBuildCacheKeyExecuter.java:80)
    16:59:16 	at org.gradle.api.internal.tasks.execution.ResolveBuildCacheKeyExecuter.execute(ResolveBuildCacheKeyExecuter.java:59)
    16:59:16 	at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    16:59:16 	at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
    16:59:16 	at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
    16:59:16 	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    16:59:16 	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
    16:59:16 	at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    16:59:16 	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
    16:59:16 	at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
    16:59:16 	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    16:59:16 	at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    16:59:16 	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
    
    in:core a:bug affects-version:4.1 
    opened by dstepanov 65
  • Proposal: Remove fixed Kotlin runtime version limitation in Gradle

    Proposal: Remove fixed Kotlin runtime version limitation in Gradle

    Today Gradle bundles an embedded version of Kotlin. My understanding is that this is due to usage of private compiler APIs in order to support kotlin-dsl. This prevents all plugins on the classpath from using different (let alone newer) Kotlin versions though, even if both they and the consuming build are not using kotlin-dsl.

    This is something that I feel is fundamentally holding back the ecosystem, because it negatively affects plugin developers in the following ways:

    • They must set arbitrary language settings on their build, like lowering the languageLevel setting to 1.3 today, otherwise risk accidentally writing incompatible code.
    • For much of Kotlin 1.4.x's release cycle, they could not use Kotlin 1.4 period. Kotlin 1.4 was not added until Gradle 6.8, and even then it didn't allow kotlin 1.4 language targeting.
    • Language level alone only covers their own sources, but then they must also meticulously test any Kotlin-using external libraries that may have updated to 1.4 and use 1.4 APIs.
      • A good example of where this comes up is Okio, OkHttp, or Coroutines. Even something as simple as a member reference becomes a breaking change when compiled in 1.4 and run in a 1.3 environment.

    This would be less of an issue if Gradle updated its embedded Kotlin version regularly, but the judgement today is that it cannot target a new minor version of Kotlin (now on a ~6mo cadence) until a new major version of Gradle (~once per year). While this may have lined up somewhat with Kotlin's previous ~annual release strategy, this is unwinding now with Kotlin 1.5's upcoming release. As of now, Gradle is on track to miss the entirety of Kotlin 1.4 due to its reluctance to update or allow users to use a new version. This will only continue now that Kotlin's release cycle is accelerated.

    I understand that part of this reluctance to allow newer versions is because they may break. However, I think this is easily remedied by simply making it clear what the currently supported version is. Gradle adopts this approach with Java today, where it often supports running on a newer version but may not officially support it until a later release (major or otherwise). Gradle added Java 15 support in the 6.7 minor release, for instance.

    The private API usage does offer a good reason for using a fixed version, but again there is precedent for this too as Gradle uses private javac APIs too (namely from the private-ish tools jar) to support cases like incremental compilation.

    I would like to propose adopting one of the following strategies (in order of preference, though they're not all mutually exclusive either):

    1. Unbundle Kotlin, remove private API usage or move it behind a flag. "If you want to use these APIs in kotlin-dsl, this must be enabled and comes with these restrictions"
    2. Unbundle Kotlin, use a simple minimum/supported version and denote new un-tested versions as unsupported "your mileage may vary"
    3. Allow/commit to more frequent updates. I.e. allow minor Kotlin version updates in minor Gradle version updates
    4. Unbundle Kotlin, shade the embedded kotlin compiler or its privately used APIs to avoid conflict
    in:kotlin-dsl 
    opened by ZacSweers 62
  • `Problems reading data from Binary store` error

    `Problems reading data from Binary store` error

    After update to Gradle 5.2 we started noticing build failures with missed dependencies on the disk. For example:

    > Could not resolve all dependencies for configuration ':app:acceptanceRuntimeClasspath'.
       > Problems reading data from Binary store in /private/var/folders/j9/m08k8g8d6_d1qqp714rqbhgr0000gv/T/gradle908977521929543055.bin (exist: false)
    

    Context

    We have a multi-module android project with a mix of Kotlin library, Android library and Android application modules. Sometimes similar error happens with kapt task.

    We use Gradle 5.2, Kotlin 1.3.21 and Android Gradle Plugin 3.4-beta-03. We use Gradle cache server that is hosted in local network.

    This is the content of our gradle.properties:

    org.gradle.jvmargs=-Xmx4g -XX:MaxMetaspaceSize=2g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
    
    # When configured, Gradle will run in incubating parallel mode.
    # This option should only be used with decoupled projects. More details, visit
    # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
    org.gradle.parallel=true
    
    # Configure Gradle build cache.
    # https://docs.gradle.org/current/userguide/build_cache.html
    # Disbaled while checking if build is still failing
    org.gradle.caching=true
    
    # Enable experimental feature to allow Gradle to configure only necessary projects.
    # https://docs.gradle.org/current/userguide/multi_project_builds.html#sec:configuration_on_demand
    org.gradle.configureondemand=true
    
    # Experimental flag to allow Kapt to use Gradle's Worker API.
    # Disabled because it causes OutOfMemoreyExceptions in combination with Android Gradle Plugin 3.4 beta.
    kapt.use.worker.api=false
    
    # Disable the new code shrinking/obfuscation tool R8, we use DexGuard instead.
    android.enableR8=false
    
    # Enable AndroidX
    android.useAndroidX=true
    android.enableJetifier=true
    
    # Required for Robolectric 4.0
    android.enableUnitTestBinaryResources=true
    

    There are gradle additional properties that we set on CI:

    -Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.workers.max=2 -Dkotlin.incremental=false
    

    Steps to Reproduce (for bugs)

    Unfortunately, I can not provide own project as well it only fails for specific feature branch. Rest looks unaffected.

    Your Environment

    It fails and on Mac and Linux build agents. We use gitlab runners to run our CI. I can not reproduce same on the local machine.

    in:dependency-management 
    opened by emartynov 59
  • Make dependency caches relocateable

    Make dependency caches relocateable

    Original issue: https://issues.gradle.org/browse/GRADLE-2690

    Highly votes issue: 24

    Expected Behavior

    The cache can be transferred from one machine to another and can be used in offline mode.

    Current Behavior

    Since Gradle's cache stores the native OS absolute path (e.g. drive letters "C:" and backslash() file separators in the case of Windows) it will not work if unpacked into a different drive letter and/or directory structure. Similarly, the cache cannot be moved between a Windows and *NIX environment. (Our build process supports running under both Linux and Windows.)

    Without necessarily changing any of the external behaviors/interfaces it would be fantastic if the artifact cache stored paths relative to the cache base directory and normalized to always use '/' as the file separator. Please note that this request is NOT asking to change the outwardly-visible behavior of the cache; i.e. existing APIs could still return runtime-resolved absolute paths.

    Context

    My company requires that we be able to escrow our software. This requires us to build a package that includes everything necessary to build, including 3rd-party libraries, without assuming that any particular network resources are available.

    To satisfy this requirement, I need to be able to package the Gradle artifact cache (e.g. the entire GRADLE_USER_HOME) and then use it on another machine (which I may not be able to control) and have the cached artifacts resolve successfully in --offline mode

    in:dependency-management a:feature 
    opened by bmuschko 55
  • Using mavenContent{include

    Using mavenContent{include ""} in pluginManagement in settings.gradle leads to a fake project being initialized

    Expected Behavior

    When specifying maven repository content filters in the pluginManagement section in settings.gradle, specifically include("group.name"), it shouldn't affect the project structure of the build.

    Current Behavior

    Adding a include("maven.group") to the contentFilter

    Context

    Steps to Reproduce

    Example settings.gradle, modified after gradle init in a folder named grtest:

    pluginManagement {
        repositories {
            mavenCentral {
                mavenContent {
                    include("maven.group")
                }
            }
            gradlePluginPortal()
        }
    }
    
    rootProject.name = 'grtest'
    

    Running ./gradlew projects yields:

    ------------------------------------------------------------
    Root project 'grtest'
    ------------------------------------------------------------
    
    Root project 'grtest'
    \--- Project ':maven.group'
    
    To see a list of the tasks of a project, run gradlew <project-path>:tasks
    For example, try running gradlew :maven.group:tasks
    

    Reproducer repository: https://github.com/eigenraven/gradle-issue-mavencontent/actions/runs/3848973881/jobs/6557404363#step:4:63

    Your Environment

    Arch Linux, OpenJDK 17, Gradle 8.0-rc1 downloaded via gradle wrapper Build scan URL: https://scans.gradle.com/s/7bbyu3vwvfjl4

    a:bug to-triage 
    opened by eigenraven 0
  • Ivy Publish repo missing configuration on warm CC

    Ivy Publish repo missing configuration on warm CC

    These properties are required to be preserved in a warm cache:

    • artifactPatterns
    • ivyPatterns

    Also, Ivy tests were changed to use externalized credentials, as inlined credentials are discarded with CC.

    We only noticed that when enabling load-after-store.

    Issue: #23397

    in:publishing-plugins @configuration-cache 
    opened by abstratt 2
  • Adding buildscript dependency causing java.lang.ArrayIndexOutOfBoundsException

    Adding buildscript dependency causing java.lang.ArrayIndexOutOfBoundsException

    Context

    I ran into this while developing a gradle plugin that has this package in the dependency tree. Building and publishing the plugin was not an issue but as soon as I tried to apply the plugin I would run into this exception.

    I was then able to replicate the issue just by including the package as a buildscript dependency.

    Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 48 out of bounds for length 37	
    at org.objectweb.asm.ClassReader.readLabel(ClassReader.java:2679)
    

    Steps to Reproduce

    https://github.com/ivoadf/gradle-bug-reproducer/actions/runs/3847564484/jobs/6554177681#step:4:155

    Your Environment

    Build scan URL: https://scans.gradle.com/s/k5ts5ys4hs4xy

    a:bug to-triage 
    opened by ivoadf 0
  • Fix typo in method names

    Fix typo in method names

    Fixes #23390 (note in OP)

    Context

    See note in https://github.com/gradle/gradle/issues/23390

    Contributor Checklist

    • [x] Review Contribution Guidelines
    • [ ] Make sure that all commits are signed off to indicate that you agree to the terms of Developer Certificate of Origin.
    • [x] Make sure all contributed code can be distributed under the terms of the Apache License 2.0, e.g. the code was written by yourself or the original code is licensed under a license compatible to Apache License 2.0.
    • [x] Check "Allow edit from maintainers" option in pull request so that additional changes can be pushed by Gradle team
    • [ ] Provide integration tests (under <subproject>/src/integTest) to verify changes from a user perspective
    • [ ] Provide unit tests (under <subproject>/src/test) to verify logic
    • [ ] Update User Guide, DSL Reference, and Javadoc for public-facing changes
    • [ ] Ensure that tests pass sanity check: ./gradlew sanityCheck
    • [ ] Ensure that tests pass locally: ./gradlew <changed-subproject>:quickTest

    Gradle Core Team Checklist

    • [ ] Verify design and implementation
    • [ ] Verify test coverage and CI build status
    • [ ] Verify documentation
    opened by TWiStErRob 1
Releases(v8.0.0-RC1)
A fast build system that encourages the creation of small, reusable modules over a variety of platforms and languages.

Buck Buck is a build tool. To see what Buck can do for you, check out the documentation at http://buck.build/. Installation Since Buck is used to buil

Facebook 8.5k Dec 31, 2022
a fast, scalable, multi-language and extensible build system

Bazel {Fast, Correct} - Choose two Build and test software of any size, quickly and reliably. Speed up your builds and tests: Bazel rebuilds only what

Bazel 20k Jan 4, 2023
Zero is a core test automation project that can be used as a basis for any kind of test automation project (API, Browser, Mobile)

Zero Zero is our feature rich, core test automation framework, that can be used as an underlying automation framework for any/and all kind of test aut

Pramod Kumar Yadav 10 Dec 16, 2022
This repo contains all the materials for placement as well as Practical lab codes for all subjects and notes. For students graduating in 2023

UEMK_PLACEMENT_2023 This repo contains all the materials for placement as well as Practical lab codes for all subjects and notes. For students graduat

Shambashib Majumdar 8 Mar 5, 2022
Fast and Easy mapping from database and csv to POJO. A java micro ORM, lightweight alternative to iBatis and Hibernate. Fast Csv Parser and Csv Mapper

Simple Flat Mapper Release Notes Getting Started Docs Building it The build is using Maven. git clone https://github.com/arnaudroger/SimpleFlatMapper.

Arnaud Roger 418 Dec 17, 2022
A static site for the Jenkins automation server

jenkins.io This repository is what powers the Jenkins website. This uses Awestruct with Asciidoctor under the hood to provide a very useful and compel

Jenkins Infra 253 Jan 1, 2023
Roman Beskrovnyi 250 Jan 9, 2023
Test Automation Made Simple

Karate Test Automation Made Simple. Karate is the only open-source tool to combine API test-automation, mocks, performance-testing and even UI automat

Intuit 6.5k Dec 28, 2022
Serenity BDD is a test automation library designed to make writing automated acceptance tests easier, and more fun.

That feeling you get when you know you can trust your tests Serenity BDD is a library designed to make writing automated acceptance tests easier, and

Serenity BDD 654 Dec 28, 2022
An implementation of darcy-web that uses Selenium WebDriver as the automation library backend.

darcy-webdriver An implementation of darcy-ui and darcy-web that uses Selenium WebDriver as the automation library backend. maven <dependency> <gr

darcy framework 20 Aug 22, 2020
Flexible framework for workflow and decision automation with BPMN and DMN. Integration with Spring, Spring Boot, CDI.

Camunda Platform - The open source BPMN platform Camunda Platform is a flexible framework for workflow and process automation. It's core is a native B

Camunda BPM 3k Dec 30, 2022
A browser automation framework and ecosystem.

Selenium Selenium is an umbrella project encapsulating a variety of tools and libraries enabling web browser automation. Selenium specifically provide

Selenium 25.5k Jan 7, 2023
Enabling Test Automation in Java

SeLion Enabling Test Automation in Java SeLion builds on top of TestNG and Selenium to provide a set of capabilities that get you up and running with

PayPal 268 Dec 11, 2022
Roman Beskrovnyi 248 Dec 21, 2022
an awesome automation test framework

PnxTest PnxTest is a Java-based test automation framework that unites all testing layers: Mobile applications, WEB applications, REST services. Due to

nicolas chen 21 Jul 29, 2022
🎉Back end module of Sonic UI automation testing platform. Sonic-UI自动化测试平台后端模块。

?? Sonic UI automation testing platform. English | 简体中文 Background What is sonic ? Nowadays, automation testing, remote control and other technologies

Eason 1.7k Jan 1, 2023
The automation tower defense game

A sandbox tower defense game written in Java. Trello Board Wiki Javadoc Contributing See CONTRIBUTING. Building Bleeding-edge builds are generated aut

null 16.8k Dec 31, 2022
Jenkins automation server

About In a nutshell, Jenkins is the leading open-source automation server. Built with Java, it provides over 1,700 plugins to support automating virtu

Jenkins 20.1k Jan 9, 2023
An free online poker HUD/tracker -> poker GTO solver automation tool

GTOHelper An online poker HUD/tracker (PokerTracker4) -> poker GTO solver (PioSolver) automation tool The initial purpose of the tool was to alleviate

null 10 Jan 3, 2023
Test Automation Made Simple

Karate Test Automation Made Simple. Karate is the only open-source tool to combine API test-automation, mocks, performance-testing and even UI automat

Karate Labs 6.5k Dec 31, 2022