Как я могу вызвать код из одного подпроекта в дополнительных задачах другого подпроекта? - PullRequest
0 голосов
/ 08 июня 2019

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

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

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

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

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

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

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

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

1 Ответ

1 голос
/ 08 июня 2019

У вас проблема с курицей или яйцом, когда все загрузчики классов проекта 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')
   } 
} 
...