Как я могу вызвать код из одного подпроекта в задачах другого подпроекта?
У меня есть проект с двумя подпроектами.
Один из этих подпроектов, "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')
}
}