Java 德隆博克';使用添加的jar依赖项删除源代码

Java 德隆博克';使用添加的jar依赖项删除源代码,java,gradle,lombok,Java,Gradle,Lombok,我无法删除我的Java源代码,这显然是因为该项目具有jar依赖性,我不明白为什么。有两个jar文件必须提交到repo以进行标记,它们通过添加行compile files('myproj1.jar')添加到build.gradle文件的dependencies节点中的项目中。因此,build.gradle文件的相关部分如下所示: dependencies { compile files('myproj1.jar') compile files('myproj2.jar')

我无法删除我的Java源代码,这显然是因为该项目具有jar依赖性,我不明白为什么。有两个jar文件必须提交到repo以进行标记,它们通过添加行
compile files('myproj1.jar')
添加到
build.gradle
文件的
dependencies
节点中的项目中。因此,
build.gradle
文件的相关部分如下所示:

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

     .....
}
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
}
当我运行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任务要使用jar文件中的
AntClassLoader

我已经试过了德隆博金密码

这是我的
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了。

因此,在继续尝试一个错误后,我有了一个工作的实现。回答我自己的问题,这个问题与额外的Jar文件无关。相反,当gradle运行
delombok
任务时,lombok jar中的类不在
org.gradle.api.AntBuilder
(即
ant
任务)的类路径中,因此它在任何地方都没有对
lombok.delombok.ant.Tasks$delombok
的引用(这在此时看起来很明显,但在当时并不明显)

到目前为止,解决方案是从
配置中添加这些引用

将此代码片段与此代码片段相结合,您可以使用以下内容:

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

     .....
}
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
}

希望这能帮助其他需要删除代码的人。

基于您的实现的帖子已经很老了,这可能是罪魁祸首。我使用的是一个gradle插件,这使得delomboking非常简单,但同时也过时了。我首先要链接到一个更新的插件。OTOH您的家用brew解决方案根本不需要插件,所以+1。@maaartinus所以,根据您发送的链接,如果我只是将lombok依赖项更改为
compileOnly
,它将为我删除它?不知道。我没有使用delombok ATM(我在上一次大升级时掉了它,从那以后就不再需要它了)。