Java 德隆博克';使用添加的jar依赖项删除源代码
我无法删除我的Java源代码,这显然是因为该项目具有jar依赖性,我不明白为什么。有两个jar文件必须提交到repo以进行标记,它们通过添加行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')
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(我在上一次大升级时掉了它,从那以后就不再需要它了)。