IntelliJ IDEA Gradle项目无法识别/定位Antlr生成的源

时间:2018-06-20 11:49:50

标签: java gradle intellij-idea kotlin antlr4

我在一个简单的Kotlin / Gradle项目中使用Antlr,虽然我的Gradle构建正在生成Antlr源,但无法将其导入到项目中。

如您所见(在左侧),正在生成类(Lexer / Parser等)。我还将此generated-src/antlr/main目录配置为 Source Root 。我看到的大多数问题都将其列为解决方案,但我已经做到了。

在多次重建(在IDEA和CLI中)以及所有常见的“无效缓存并重新启动”问题之后,问题仍然存在。

此外,CLI上的Gradle构建中列出了导入问题,因此它似乎并不孤立于IDEA。

我在这里想念什么?

enter image description here

这是IDEA最初创建项目时产生的build.gradle文件,以及IDEA用于项目/工作区同步的文件。

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.2.50'
}

group 'com.craigotis'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

apply plugin: 'antlr'

dependencies {
    antlr "org.antlr:antlr4:4.5"
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.2.0'
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

3 个答案:

答案 0 :(得分:1)

是否应该找到 compiled 类而不是源?您是否在目标目录中看到antlr生成的类?

尝试一下:首先构建项目而不引用或使用任何ANTLR生成的类,并且仅在构建成功之后,然后添加引用它们的代码。

(换句话说,我认为这是因为您的ANTLR源代码是在引用它们的代码之后进行编译的。它们从来没有机会进行编译,因为之前构建失败了)

如果确实如此,您还可以通过拆分为两个工件并确保ANTLR在使用该工件的代码之前构建ANTLR来解决它

答案 1 :(得分:1)

尝试在想法模块中添加生成的源,例如Daniel Dekany here的这篇文章:

apply plugin: "idea"
...
sourceSets.main.java.srcDir new File(buildDir, 'generated/javacc')
idea {
    module {
        // Marks the already(!) added srcDir as "generated"
        generatedSourceDirs += file('build/generated/javacc')
    }
}

答案 2 :(得分:1)

尝试将其添加到您的build.gradle

sourceSets {
  main.java.srcDirs += "${project.buildDir}/generated-src/antlr/main"
}

generateGrammarSource {
  arguments += ["-visitor", "-package", "com.craigotis.sprint.core.antlr"]
  outputDirectory = file("${project.buildDir}/generated-src/antlr/main/com/craigotis/sprint/core/antlr")
}

compileKotlin.dependsOn generateGrammarSource