我想做的是在Scala构建的类文件上执行Java批注处理。
我可以在构建后通过调用javac手动完成此操作
javac -cp ".../.m2/repository/net/java/sezpoz/sezpoz/1.11/sezpoz-1.11.jar:." \
-proc:only -processor net.java.sezpoz.impl.Indexer6 \
-verbose mypackage.ScalaUseMyAnnotations$Inner
但我想将其作为gradle构建的一部分。最终,我希望它可以在Scala中创建Jenkins插件,并且需要使用sezpoz处理这些插件以进行源注释。因此使用Gradle。
这是我到目前为止的内容,但是没有用
group 'mytest'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'scala'
sourceSets.main.scala.srcDir "src/main/java"
sourceSets.main.java.srcDirs = []
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
jar {
from {
(configurations.runtime).collect {
it.isDirectory() ? it : zipTree(it)
}
}
manifest {
attributes 'Main-Class': 'mypackage.Main'
}
}
ext {
versions = [
scala : '2.11.8',
scalatest : '2.2.6'
]
}
task annotate (type: JavaCompile) {
source = sourceSets.main.output.classesDir
include 'mypackage.ScalaUseMyAnnotations$Inner'
classpath = sourceSets.main.compileClasspath
destinationDir = sourceSets.main.output.classesDir
outputs.upToDateWhen { false }
println("[annotate] ${sourceSets.main.output.classesDir}")
}
annotate.options.compilerArgs = ['-proc:only', '-processor', 'net.java.sezpoz.impl.Indexer62', '-verbose']
task run(type: JavaExec, dependsOn: compileScala) {
main = 'mypackage.Main'
classpath sourceSets.main.runtimeClasspath
classpath configurations.runtime
}
compileScala.doLast {
tasks.annotate
}
dependencies {
compile group: 'net.java.sezpoz', name: 'sezpoz', version: '1.11'
runtime group: 'org.scala-lang', name: 'scala-library', version: "$versions.scala"
compile group: 'org.scala-lang', name: 'scala-library', version: "$versions.scala"
}
问题在于,似乎找不到用于注释的类文件,它肯定是手动工作的,并且始终认为任务是最新的。
这是repo,但是Scala喜欢最近的Java8编译器
最佳答案
所以这是我经过深思熟虑后最终所做的
task annotate(dependsOn:compileScala, type: Exec) {
args '-proc:only'
args '-d'
args compileJava.destinationDir
args '-classpath'
args compileJava.classpath.getAsPath() + java.io.File.pathSeparatorChar + compileJava.destinationDir
if (logging.level >= LogLevel.INFO) {
args '-verbose'
}
doFirst{
fileTree(compileScala.destinationDir).each { File file ->
if(file.path.contains('-')) {
return
}
args file.path.minus(compileScala.destinationDir).minus('.class').substring(1).replaceAll(File.separator,'.')
}
}
executable "javac"
}
compileScala.doLast {annotate.execute()}
它可能不是很成功,我希望使用
JavaCompile
类型的任务。主要问题是必须传递没有.class扩展名的类
我在github中更新了仓库
关于java - 在Scala内置的类文件上运行Java源注释处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38291192/