Я создал плагин Gradle, который генерирует нужный нам Java-код.
Я протестировал свой плагин на тестовом проекте, и он отлично работал, файлы генерировались правильно.
Теперь мне нужно применить свой плагин к проекту, над которым я работаю, для этого я добавил следующие строки в build.gradle
проекта:
buildscript {
repositories {
[...]
mavenLocal() <--
}
dependencies {
[...]
classpath 'my.plugin.path:app:1.0' <-- the maven local path of my plugin
}
}
apply plugin: 'myPlugin' <--
Затем файлы, которые генерирует мой плагин, помещаются в папку src
. В таком случае проект строится правильно.
НО, я хотел бы поместить сгенерированные файлы в папку target
.
Я пробовал два способа решить эту проблему:
- Добавьте блок sourceSets в
build.gradle
, например:
sourceSets {
main {
java {
srcDirs = ['src/main/java', 'target/java']
}
}
}
И когда я пытаюсь выполнить gradle build
, задача :compileDebugJavaWithJavac
завершается неудачей, потому что некоторый код в папке src/main/java
нуждается в коде, который я генерирую. Но код в целевой папке, похоже, не скомпилирован.
- Добавьте исходную папку через код плагина
Вот мой класс плагина (в Groovy):
import com.android.build.gradle.AppPlugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.Task
class MyPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
def hasAppPlugin = project.plugins.hasPlugin AppPlugin
project.afterEvaluate({
def variants = hasAppPlugin ? project.android.applicationVariants : project.android.libraryVariants
variants.all { variant ->
def compileJavaTask = variant.javaCompile
[...] // Adds tasks to the plugins
compileJavaTask.source = project.files("${project.rootDir}/target/java", output)
compileJavaTask.dependsOn javaTask
}
})
}
}
Двух последних строк должно быть достаточно, но у меня та же проблема, что и в случае 1.
Я на самом деле понятия не имею, почему это не работает, у кого-нибудь есть идеи?