How to resolve circular dependency in Gradle

后端 未结 2 566
野的像风
野的像风 2021-01-11 09:56

I am migrating a Java project from Ant to Gradle. I think the best solution is to use Gradle\'s multi-project support, but I cannot find a way to get rid of a circular depen

相关标签:
2条回答
  • 2021-01-11 10:10
    project(':project-a') {
        dependencies {
            compile project(':project-b')
        }
    }
    
    project(':project-b') {
        dependencies {
            //circular dependency to :project-a
            compile project(':project-a')
        }
    
    
       compileJava {
           doLast {
               // NOTE: project-a needs :project-b classes to be included
               // in :project-a jar file hence the copy, mostly done if we need to  
               // to support different version of the same library
               // compile each version on a separate project
              copy {
                   from "$buildDir/classes/java/main"
                   include '**/*.class'
                   into project(':project-a').file('build/classes/java/main')
    
         }
       }
    
     }
    }
    

    product-a --> build.gradle

    /**
     * Do nothing during configuration stage by
     * registering a GradleBuild task
     * will be referenced in the task compileJava doLast{}
     */
    tasks.register("copyProjectBClasses", GradleBuild) {
      //we'll invoke this later
      def taskList = new ArrayList<String>()
      taskList.add(":product-b:compileJava")
      logger.lifecycle "Task to execute $taskList..."
      setTasks(taskList)
    }
    
    // make sure :project-b classes are compiled first and copied to this project before 
    // all classes are added to the jar, so we do it after :project-a compiled.
    compileJava {
      doLast {
        synchronized(this) {
          // create temp file to avoid circular dependency
          def newFile = new File("$buildDir/ongoingcopy.tmp")
          if (!newFile.exists()) {
            newFile.createNewFile()
            GradleBuild buildCopyProjectBClasses = tasks.getByName("copyProjectBClasses")
            buildCopyProjectBClasses.build()
          }
          newFile.delete()
        }
      }
    }
    
    0 讨论(0)
  • 2021-01-11 10:16

    Removing a circular dependency cannot be resolved with build trickery. You're going to have to refactor your modules so there is no longer a circular dependency. From your module names, and with no other information, I would think you would want to extract the part of "common" that depends on "product-*" and put it into a new module.

    0 讨论(0)
提交回复
热议问题