java - 在Scala内置的类文件上运行Java源注释处理

标签 java scala gradle annotations

我想做的是在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/

相关文章:

java - com.liferay.util.PwdGenerator

java - Java Web Start 应用程序故障排除和访问日志文件

eclipse - 导入Eclipse Gradle Spring Boot项目后,Lombok在IntelliJ IDEA 18.1版本中不起作用

scala - 如何在不分配给 val 的情况下使用隐式调用返回的函数

hibernate - 为什么 gradle 不会从 jenkins 工作中运行

gradle - Gradle和Gradlew的问题

java - 使用 Recycler View 调用 Api 加载更多

java - android,NavigationView的setItemTextColor和setItemIconTinList没有效果

Scala如何更新不可变列表中的值

Scalatest 在 Intellij 13.1 中不起作用