删除带有添加 jar 依赖项的源代码



我无法删除我的Java源代码,这显然是由于该项目所拥有的JAR依赖性,我不明白为什么。有两个jar文件必须将其归为标记的存储库,并且通过添加该行compile files('myproj1.jar'),将它们添加到build.gradle文件的dependencies节点中。因此,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任务使用JAR文件中的AntClassLoader

我尝试了这篇文章的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源代码

因此,在继续审判后,我有一个工作实现。要回答我自己的问题,问题与其他JAR文件无关。相反,当Gradle运行delombok任务时,Lombok Jar中的类不在org.gradle.api.AntBuilder的类中(即ant任务(,因此它在任何地方都没有对lombok.delombok.ant.Tasks$Delombok的引用(此时似乎很明显,但是当时不是(。

到目前为止,解决方案是从configurations.compile

中添加这些参考

结合这篇文章的代码snippits,这篇文章可以使用类似的事情来完成:

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
}

希望这对其他人需要删除其代码有所帮助。

最新更新