首页 > 解决方案 > 如果配置中的类在同一个包中,为什么我必须在新配置中包含 main 的输出?

问题描述

让我们假设一个具有如下项目结构的 java 项目:

src
 itest
   java
     SourcesTestsItest.java
 main
   java
       gradle_pr
           pojo.java
 test
    java
        gradle_pr
             SourceSetsTest.java

构建.gradle

/*
 * This file was generated by the Gradle 'init' task.
 *
 * This generated file contains a sample Java Library project to get you started.
 * For more details take a look at the Java Libraries chapter in the Gradle
 * User Manual available at https://docs.gradle.org/6.3/userguide/java_library_plugin.html
 */

plugins {
    // Apply the java-library plugin to add support for Java Library
    id 'java-library'
}

repositories {
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

sourceSets{
    itest{
         compileClasspath += sourceSets.main.output
        runtimeClasspath += sourceSets.main.output
        java{
            srcDirs("src/itest")
        }
    }
}

configurations{
    itestImplementation.extendsFrom(testImplementation)
    itestRuntimeOnly.extendsFrom(testRruntimeOnly)
}

dependencies {
    // This dependency is exported to consumers, that is to say found on their compile classpath.
    api 'org.apache.commons:commons-math3:3.6.1'

    // This dependency is used internally, and not exposed to consumers on their own compile classpath.
    implementation 'com.google.guava:guava:28.2-jre'
     
    // Use JUnit test framework
    testImplementation 'junit:junit:4.12'

     implementation('org.apache.httpcomponents:httpclient:4.5.12') 

     itestImplementation('com.google.guava:guava:29.0-jre')
}



task printSourceSetInformation(){

    doLast{
        sourceSets.each { srcSet ->
            println "["+srcSet.name+"]"
            print "-->Source directories: "+srcSet.allJava.srcDirs+"\n"
            print "-->Output directories: "+srcSet.output.classesDirs.files+"\n"
            print "-->Compile classpath:\n"
            srcSet.compileClasspath.files.each { 
                print "  "+it.path+"\n"
            }
            println ""
        }
    }
}

task itest(type: Test) {
    description = "Run integration tests"
    group = "verification"
    testClassesDirs = sourceSets.itest.output.classesDirs
    classpath = sourceSets.itest.runtimeClasspath
}

为什么我使用以下几行

 compileClasspath += sourceSets.main.output
        runtimeClasspath += sourceSets.main.output

如果 pojo 类应该在 itest 下的测试类中可见,因为它们在同一个包中?默认配置如何工作,以便测试用例可以看到生成的 main 编译代码?

标签: javagradle

解决方案


Gradle 本身并不知道您的配置如何相互依赖(即,可能是main配置依赖itest或相反)。

对于maintest配置,当您应用java-library插件时,会为您建立此依赖关系。


推荐阅读