【问题标题】:Gradle Build - Execution failed for task ':sonarqube' can't be indexed twiceGradle Build - 任务“:sonarqube”的执行失败无法被索引两次
【发布时间】:2021-02-03 22:08:20
【问题描述】:

我在声纳的 gradle 构建中收到错误“文件无法被索引两次”。我是否必须为声纳添加任何包含/排除属性?非常感谢任何帮助。

如果我在 sourceSets 下的测试中取出“src/main/java”,我会收到 junit 测试用例的编译错误。

这就是我的 build.gradle 文件内容的样子,

group = 'groupid'
apply plugin: 'gradleFortify'
apply plugin: 'org.sonarqube'
apply plugin: 'eclipse'
apply plugin: 'groovy'
apply plugin: 'java'
apply plugin: 'jacoco'
apply plugin: 'groovy'
//apply plugin: "java-library-distribution"
//apply plugin: 'distribution'

version=version
sourceCompatibility = 1.8


repositories {
        maven {
        url "artifactory"
            credentials {
            }
        }
        sonarqube {
            properties {
                property 'sonar.sourceEncoding', 'UTF-8'
                property "sonar.exclusions", ["**/*Test.java"]
            }
        }
}

buildscript {
    repositories {
        maven {
        url "artifactory"
            credentials {
            }
        }
    dependencies {
        classpath 'org.jfrog.buildinfo:build-info-extractor-gradle:4.9.7' 
        classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0'
        
    }
}

sourceSets {
    main {
        java {
            srcDirs = ['src/main/java']
        }
    }
    test {
        java.srcDirs = ['src/test/java','src/main/java']
    }
}

dependencies{


}
 task preclean(type: Delete) {
     delete 'build'
 } 
 task jcompile(type: JavaCompile) {
     dependsOn preclean
     source = fileTree(dir: 'src/main/java', include: '**/*.java')
     destinationDir = file('build/classes')
     sourceCompatibility = '1.8'
     targetCompatibility = '1.8'
     classpath = configurations.runtime
 }
 

 task copyResources( type: Copy ) { 
 }

 task copyClasses( type: Copy ) {
 }
 
 
 jar {
    dependsOn jcompile
    archiveName = 'prj1.jar'
    manifest {
        attributes('Implementation-Title': project.name,
                   'Implementation-Version': project.version)
    }
     into('lib') {
         println "includeInJar: " + configurations.runtime.collect { File file -> file }
         from configurations.runtime
     }
 }
// jar.finalizedBy(jarTask) { }
 
 
sonarqube {
    properties {
        property "sonar.projectName", "prj-${version}"
        property "sonar.projectKey", "prj-${version}"
    }
}

test {
    useJUnitPlatform()
    finalizedBy jacocoTestReport
}
jacocoTestReport {
    afterEvaluate {
        classDirectories = files(classDirectories.files.collect {
            fileTree(dir: it, includes: ['com/**'])
        })
    }
}

【问题讨论】:

  • 如果我在 sourceSets 下的测试中取出“src/main/java”,我会收到 junit 测试用例的编译错误。 您需要修复该错误。请将此作为问题提出或在此问题中添加详细信息
  • 目录结构似乎是标准的。你真的根本不需要 sourceSets。
  • @jayan,编译错误是由于 gradle build 没有找到对应的 java 类(说找到无效类型)。我将删除 sourceSets 并尝试一下。
  • 删除 sourceSet 后无效。 “java:268:错误:找不到符号FAILURE:构建失败并出现异常。*出了什么问题:任务':compileTestJava'执行失败。>编译失败;有关详细信息,请参阅编译器错误输出。”。它无法找到 java 类。
  • 请添加该错误日志。通常,生产类被添加到类路径中以进行测试。我不确定你空的依赖块是否增加了麻烦。

标签: java gradle sonarqube build.gradle sonarqube-scan


【解决方案1】:

所描述的问题很可能是由 Gradle 提供的开箱即用的自定义任务引起的:

  • 任务preclean 删除可能太多。请改用clean
  • 任务jcompile 编译主要的Java 源代码,基本上与compileJava 重复。默认情况下,jar 任务已经依赖于compileJava

我建议如下:

  1. 删除sourceSets 配置,因为您遵循使用src/main/javasrc/test/java 的约定。
  2. 删除自定义任务precleanjcompile
  3. 清理您的构建脚本并删除空任务copyClassescopyResources 以及无操作分配version=version
  4. 从那时起,如果您有自定义构建的要求,请尝试使用 Gradle 已经提供的功能。您可能想先阅读Building Java & JVM projects

【讨论】:

  • 如果我删除 sourceSets,构建将无法找到 java 类,并且没有任何已编译的.jar {} 依赖于 jcompile。你想让我也拿出 jar{} 吗?
  • 我会先尝试删除任务jcompile。然后从任务jar 中删除dependsOn jcompile。如果这根本没有帮助,我想请您提供MVCE
  • 没有什么对我有用。经过一番研究,这个stackoverflow中提供的解决方案帮助我修复了。 stackoverflow.com/questions/61707087/…
猜你喜欢
  • 2019-03-09
  • 2021-08-07
  • 2020-03-16
  • 2023-03-15
  • 2015-02-20
  • 1970-01-01
  • 2017-10-07
  • 2014-10-25
  • 1970-01-01
相关资源
最近更新 更多