Gradle не в состоянии создать толстую флягу на исходном наборе antlr после очистки, иначе преуспевает

Я испытываю странное поведение в моей сборке Gradle. У проекта, имеющего проблемы, есть открытый исходный код, так что те, кто хочет больше копаться в сборке, могут посмотреть здесь, на ветку разработки.

В родительском проекте я определил fatJar Задача следующая:

task fatJar(type: Jar, dependsOn: subprojects.compileJava) {
    manifest {
        attributes 'Implementation-Title': 'Alchemist',
        'Implementation-Version': rootProject.version,
        'Main-Class': 'it.unibo.alchemist.Alchemist'
    }
    baseName = "${rootProject.name}-redist"
    from(configurations.runtime.collect { it.isDirectory() ? it : zipTree(it) }) {
        // remove all signature files
        exclude "META-INF/*.SF"
        exclude "META-INF/*.DSA"
        exclude "META-INF/*.RSA"
        exclude 'build'
        exclude '.gradle'
        exclude 'build.gradle'
        exclude 'gradle'
        exclude 'gradlew'
        exclude 'gradlew.bat'
    }
    with jar
}

Один подпроект, в котором генерируется сбой, немного своеобразен, поскольку в нем используется ANTLR (я опускаю зависимости и другой код, который я считаю ненужным для понимания проблемы).

apply plugin: 'antlr'
sourceSets {
    antlr
}
generateGrammarSource {
    arguments += ["-visitor", "-package", "it.unibo.alchemist.biochemistrydsl"]
    def target = new File('src/antlr/java/')
    if ((target.exists() && target.isDirectory()) || target.mkdirs()) {
        outputDirectory = target
    } else {
        throw new IllegalStateException("$target is not an existing directory and could not be created as such.")
    }
}
compileAntlrJava.dependsOn('generateGrammarSource')
compileJava.dependsOn('compileAntlrJava')

Теперь, когда работает ./gradlew clean && ./gradlew fatJar из родительского проекта я получаю ошибку со следующим исключением (некоторые части для краткости опущены):

> Failed to create MD5 hash for file '[my project folder]/alchemist/alchemist-incarnation-biochemistry/build/classes/java/antlr' as it does not exist.
* Exception is:
org.gradle.api.UncheckedIOException: Failed to capture snapshot of input files for task ':fatJar' property 'rootSpec$1$1' during up-to-date check.
        at org.gradle.api.internal.changedetection.state.CacheBackedTaskHistoryRepository.snapshotTaskFiles(CacheBackedTaskHistoryRepository.java:331)
<snip>
Caused by: org.gradle.api.UncheckedIOException: Failed to create MD5 hash for file '[my project folder]/alchemist/alchemist-incarnation-biochemistry/build/classes/java/antlr' as it does not exist.
        at org.gradle.internal.hash.DefaultFileHasher.hash(DefaultFileHasher.java:45)
<snip>
Caused by: java.io.FileNotFoundException: [my project folder]/alchemist/alchemist-incarnation-biochemistry/build/classes/java/antlr (Is a directory)
        at org.gradle.internal.hash.DefaultFileHasher.hash(DefaultFileHasher.java:38)

Файл, на который система жалуется, что он является папкой, на самом деле существует и фактически является папкой, но это действительно так. Теперь, что меня озадачивает то, что если ./gradlew fatJar вызывается второй раз, успешно завершается. Это воспроизводимо в разных системах, в разных версиях Gradle (остающихся в версиях 4.x) и операционных системах (Arch Linux и MacOS X).

0 ответов

Другие вопросы по тегам