Delombok'ing исходный код с добавленными jar-зависимостями - PullRequest
1 голос
/ 05 июля 2019

Я не могу деломбокнуть мой исходный код Java, по-видимому, из-за зависимостей jar, которые есть в проекте, и я не понимаю, почему. Есть два jar-файла, которые необходимо зафиксировать в репозитории, чтобы добавить их в проект, и они добавляются в проект в узле dependencies файла build.gradle путем добавления строки compile files('myproj1.jar'). Итак, соответствующая часть файла build.gradle выглядит так:

dependencies {
     compile files('myproj1.jar')
     compile files('myproj2.jar')

     .....
}

Когда я запускаю задачу delombok, я получаю следующую ошибку:

Execution failed for task ':delombok'.
> taskdef class lombok.delombok.ant.Tasks$Delombok cannot be found
   using the classloader AntClassLoader[/path/to/repo/myproj1.jar:/path/to/repo/myproj2.jar]

Почему задача delombok использует AntClassLoader из файлов jar?

Я попробовал код delombok'ing из этой записи

Вот задание из моего build.gradle файла

def srcJava = 'src/main/java'
def srcDelomboked = 'build/src-delomboked'

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.Tasks$Delombok', classpath: configurations.compile.asPath)
        ant.delombok(from:srcJava, to:srcDelomboked, classpath: sumTree.asPath)
    }
}

Я ожидаю, что смогу сделать мой исходный код Java как часть процесса сборки, чтобы при компиляции проекта не было никаких зависимостей от Lombok.

1 Ответ

1 голос
/ 06 июля 2019

Так что после продолжения пробной ошибки у меня есть работающая реализация.Чтобы ответить на мой собственный вопрос, проблема не имеет ничего общего с дополнительными файлами Jar.Скорее, когда gradle запускает задачу delombok, классы в банке lombok не находятся в пути к классам org.gradle.api.AntBuilder (т. Е. Задача ant), и поэтому нигде не имеют ссылки на lombok.delombok.ant.Tasks$Delombok(что кажется очевидным в данный момент, но не в данный момент).

До настоящего времени было решено добавить эти ссылки из configurations.compile

Объединение фрагментов кода из этого post и этот post вы можете сделать это примерно так:

def srcDelomboked = 'build/src-delomboked'

task delombok {
    description 'Delomboks the entire source code tree'

    def srcJava = 'src/main/java'

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

    doFirst {
        ClassLoader antClassLoader = org.apache.tools.ant.Project.class.classLoader
        def collection = files( configurations.compile + configurations.testCompile )
        def sumTree = collection + fileTree( dir: 'bin' )
        sumTree.forEach { File file ->
            antClassLoader.addURL(file.toURI().toURL())
        }

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

sourceSets {
    main {
        java { srcDirs = [ srcDelomboked ] }  //blow away the old source sets so that we only use the delomboked source sets
    }
    test {
        java { srcDirs += [ srcDelomboked ] } //but add those new source sets to the tests so that their references are available at test time
    }
}

compileJava.dependsOn(delombok)

bootJar {
    mainClassName = 'com.myproj.MyMainClass' // you will need this if its a Spring Boot project
}

Надеюсь, это поможет кому-то еще, кто должен сделать свой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...