Как я могу вызвать код из одного подпроекта в задачах другого подпроекта?

У меня есть проект с двумя подпроектами.

Один из этих подпроектов, "A", содержит код, который публикуется для артефакта.

У другого подпроекта "B" есть задача, которая должна точно выполнять то, что делает один из методов в коде A. Я могу воспроизвести логику в groovy, но есть ли способ, чтобы моя задача в подпроекте B вызывала код, скомпилированный как часть подпроекта A?

Я попытался добавить блок buildscript в B, который добавил артефакт из A в classpath:

buildscript {
    dependencies {
        classpath project(':subproject-a')
    }
}

... но это дало мне ошибку:

Невозможно использовать зависимости проекта в определении пути к классу сценария.

Я не верю, что могу переместить подпроект-а в buildSrcЯ также публикую его артефакт в репозитории maven для использования другими проектами.

1 ответ

Решение

У вас есть проблема курицы или яйца, когда все загрузчики классов проекта Gradle решаются до компиляции каких-либо классов. Это может быть решено с помощью пользовательской конфигурации и Classloader

Например:

configurations {
   custom 
} 
dependencies {
   custom project(':subproject-a')
} 
task customTask {
   doLast {
      def urls = configurations.custom.files.collect { it.toURI().toURL() } 
      ClassLoader cl = new java.net.URLClassLoader(urls as URL[]) 
      Class myClass = cl.loadClass('com.foo.MyClass')

      // assuming zero args constructor 
      Object myObject = myClass.newInstance()

      // assuming method which accepts single String argument 
      java.lang.reflect.Method myMethod = myClass.getMethod('myMethodName', String.class)  
      myMethod.invoke(myObject, 'methodArg')
   } 
} 
Другие вопросы по тегам