Деломбок с использованием Gradle

В процессе сборки мы анализируем исходный код с помощью SonarQube.

Одна из проблем заключается в том, что мы используем аннотации Lombok, а SonarQube не очень хорошо справляется с этим — наш код нужно «деломбокить».

Исходный код Delomboked удалил аннотации и заменил исходный файл окончательным кодом, используемым компилятором.

Это можно сделать в gradle (см. здесь).

Ну, частично. Обычно задачу Ant можно использовать для исходного кода деломбоков. Пример кода ниже: -

task delombok {
        // delombok task may depend on other projects already being compiled
        dependsOn configurations.compile.getTaskDependencyFromProjectDependency(true, "compileJava")

        // Set up incremental build, must be made in the configuration phase (not doLast)
        inputs.files file(srcJava)
        outputs.dir file(srcDelomboked)

        doLast {
            FileCollection collection = files(configurations.compile)
            FileCollection sumTree = collection + fileTree(dir: 'bin')

            ant.taskdef(name: 'delombok', classname: 'lombok.delombok.ant.DelombokTask', classpath: configurations.compile.asPath)
            ant.delombok(from:srcJava, to:srcDelomboked, classpath: sumTree.asPath)
        }
    }

Проблема, с которой я столкнулся, заключается в том, что я считаю, что мне понадобится предварительно настроенная система муравьев (мне еще предстоит заставить это работать).

Другим подходом может быть использование плагина Maven lombok:delombok (см. здесь). Однако я не знаю, как это сделать и потребуется ли для этого предварительно настроенная среда.

Я не уверен, что это лучший подход. Предпочтителен подход, который не требует предварительно настроенной системы сборки и может полностью работать из gradle/gradlew.

Конечной целью было бы иметь проектную задачу «деломбок», которая по существу выполняла бы следующее:

java -jar lombok.jar delombok src -d src-delomboked

изменить

Так что я в значительной степени получил это, чтобы работать примерно с этим фрагментом: -

dependencies {
    compile 'org.projectlombok:lombok:1.14.2'
}

task delombok {
    description 'Delomboks the entire source code tree'
    def srcDelomboked = 'build/src-delomboked'
    def srcJava = 'src'

    inputs.files file( srcJava )
    outputs.dir file( srcDelomboked )

    doLast {
        def collection = files( configurations.compile + configurations.testCompile )
        def sumTree = collection + fileTree( dir: 'bin' )

        ant.taskdef( name: 'delombok', classname: 'lombok.delombok.ant.DelombokTask', 
            classpath: configurations.compile.asPath +
                       configurations.testCompile.asPath )
        ant.delombok( from:srcJava, to:srcDelomboked, classpath: sumTree.asPath )


        // Replace current src directory with delomboked source
        copy {
            from srcDelomboked
            into srcJava
        }
    }
}
  • Этот первый бит гарантирует, что банка ломбока доступна для градации для использования задачи муравья delombok.
  • Затем мы настраиваем исходные файлы для использования.
  • Затем мы настраиваем gradle для использования задачи ant.
  • Наконец, задача копирования заменяет все исходное дерево деломбоксированной версией кода. Очевидно, это может быть удалено в соответствии с вашими потребностями.

person VeasMKII    schedule 28.07.2014    source источник
comment
Вы пробовали на форуме Ломбок? Это, вероятно, лучшее место, чтобы решить эту проблему;). groups.google.com/forum/#!forum/project-lombok   -  person Igor Rodriguez    schedule 28.07.2014
comment
В версии 1.16.18 задача ant delombok определяется как статический внутренний класс класса Tasks, поэтому имя класса в приведенном выше ant taskdef необходимо изменить на classname: 'lombok.delombok.ant.Tasks$Delombok'.   -  person Dominik    schedule 06.11.2017


Ответы (3)


Использование задачи Ant — это нормально. Никакой «предварительной настройки Ant» не требуется. В качестве альтернативы вы можете использовать задачу JavaExec для вызова delombok, как в вашем последнем фрагменте. (JavaExec в настоящее время не поддерживает параметр -jar, поэтому вам придется назвать основной класс.) Использование подключаемого модуля Maven из Gradle невозможно (за исключением выполнения Maven с задачей Exec).

person Peter Niederwieser    schedule 28.07.2014
comment
Требуется ли какая-либо конфигурация для использования плагинов ant с Gradle? Я знаю, что файл lombok.jar содержит задачу ant, описанную здесь lombok.delombok.ant. ДеломбокЗадание - person VeasMKII; 29.07.2014
comment
Нет. Подробнее см. в Руководстве пользователя Gradle. - person Peter Niederwieser; 29.07.2014

Я думаю, что самый простой способ сделать деломбок с исходниками с помощью gradle:

task delombok {
    description 'Delomboks the source code'
    ant.taskdef(classname: 'lombok.delombok.ant.Tasks$Delombok', classpath: configurations.compile.asPath,  name: 'delombok')
    ant.mkdir(dir: 'build/src-delomboked') 
    ant.delombok(verbose: 'true', encoding: 'UTF-8', to: 'build/src-delomboked', from: 'src/main/java')
}
person Andreas M. Oberheim    schedule 26.05.2015
comment
Достаточно включить в путь только lombok.jar, то есть: classpath: configurations.compile.filter { (it.name.startsWith('lombok')) }.asPath. Включение всех «компилируемых» зависимостей в проект может вызвать проблемы. Если некоторые из зависимостей «компиляции» находятся в другом проекте в многопроектной сборке (например, задача compile project(':otherproject') ), gradle : clean` для этого проекта завершается неудачно с невозможностью удалить файл для jar проекта. - person andrius.velykis; 10.03.2017
comment
Кроме того, заключите строки ant.mkdir и ant.delombok в строку doLast { ... }, чтобы они выполнялись, когда (и только когда) вызывается задача. Как показано, задача delombok выполняется безусловно. - person William Price; 10.04.2018

https://github.com/franzbecker/gradle-lombok

buildscript {
    repositories {
        maven { url 'https://plugins.gradle.org/m2/' }
    }
    dependencies {
        classpath 'io.franzbecker:gradle-lombok:1.6'
    }
}

apply plugin: 'java'
apply plugin: 'io.franzbecker.gradle-lombok'

UPD: на данный момент мне вполне хватает плагина IntelliJ IDEA 2016.3 + Lombok и содержимого build.gradle:

dependencies {
    compileOnly 'org.projectlombok:lombok:+'
}
person Viktor Alenkov    schedule 28.05.2016