【问题标题】:Build source jar with Gradle Kotlin DSL?使用 Gradle Kotlin DSL 构建源 jar?
【发布时间】:2019-03-06 21:49:05
【问题描述】:

This question 询问如何使用 Gradle 构建 SourceJar。如何使用 Gradle Kotlin DSL 做同样的事情?

gradle 代码是:

task sourcesJar(type: Jar, dependsOn: classes) {
    classifier = 'sources'
    from sourceSets.main.allSource
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives sourcesJar
    archives javadocJar
}

【问题讨论】:

    标签: gradle kotlin gradle-kotlin-dsl


    【解决方案1】:

    所有描述的方法都在 Gradle 6.6 上失败并出现错误:
    SourceSet with name 'main' not found

    我找到了一个可行的解决方案:

    tasks {
        val sourcesJar by creating(Jar::class) {
            archiveClassifier.set("sources")
            from(android.sourceSets.getByName("main").java.srcDirs)
        }
    
        artifacts {
            archives(sourcesJar)
        }
    }
    

    【讨论】:

      【解决方案2】:

      Gradle 6.0 开始,这更加容易和清洁。您需要做的就是:

      java {
          withSourcesJar()
          withJavadocJar()
      }
      

      查看java extension 及其函数withSourcesJar()withJavadocJar() 的文档

      【讨论】:

      • 表达式“java”不能作为函数调用。找不到函数“invoke()” - 如果您尝试在子项目块中使用它以使其也适用于子项目。
      • 显然解决方法是将其更改为configure<JavaPluginExtension> { ... }
      • Java 插件不适用于 android 库(上次检查不兼容)
      【解决方案3】:

      使用 Gradle 5.3.1,这会更好一些,并且避免了弃用的 API:

      tasks {    
          val sourcesJar by creating(Jar::class) {
              archiveClassifier.set("sources")
              from(sourceSets.main.get().allSource)
          }
      
          val javadocJar by creating(Jar::class) {
              dependsOn.add(javadoc)
              archiveClassifier.set("javadoc")
              from(javadoc)
          }
      
          artifacts {
              archives(sourcesJar)
              archives(javadocJar)
              archives(jar)
          }
      }
      

      任务assemble 将创建所有工件。

      【讨论】:

        【解决方案4】:

        使用 Gradle 5.1,您可以执行以下操作

        tasks {
            val sourcesJar by registering(Jar::class) {
                classifier = "sources"
                from(sourceSets.main.get().allSource)
                dependsOn(classes)
            }
            val javadocJar by registering(Jar::class) {
                classifier = "javadoc"
                from(javadoc.get().destinationDir)
                dependsOn(javadoc)
            }
        }
        

        【讨论】:

          【解决方案5】:

          以下将起作用:

          val sourcesJar by creating(Jar::class) {
              dependsOn(JavaPlugin.CLASSES_TASK_NAME)
              classifier = "sources"
              from(sourceSets["main"].allSource)
          }
          
          val javadocJar by creating(Jar::class) {
              dependsOn(JavaPlugin.JAVADOC_TASK_NAME)
              classifier = "javadoc"
              from(tasks["javadoc"])
          }
          
          artifacts {
              add("archives", sourcesJar)
              add("archives", javadocJar)
          }
          

          完整的build.gradle.kts 如下所示:

          plugins {
              kotlin("jvm") version "1.2.71"
          }
          
          repositories {
              mavenCentral()
          }
          
          dependencies {
          }
          
          tasks {
              val sourcesJar by creating(Jar::class) {
                  dependsOn(JavaPlugin.CLASSES_TASK_NAME)
                  classifier = "sources"
                  from(sourceSets["main"].allSource)
              }
          
              val javadocJar by creating(Jar::class) {
                  dependsOn(JavaPlugin.JAVADOC_TASK_NAME)
                  classifier = "javadoc"
                  from(tasks["javadoc"])
              }
          
              artifacts {
                  add("archives", sourcesJar)
                  add("archives", javadocJar)
              }
          }
          

          【讨论】:

          • 在 Gradle 5.0 中,from(tasks["javadoc"]) 行不再有效,因为它在没有任何 get(int) 操作的情况下解析为 TaskProvider<TaskReportTask>
          • @BenjaminSchmid,尝试使用val javadocJar by creating(Jar::class) { val javadoc by tasks; from(javadoc); classifier = "javadoc"; }
          • 谢谢@madhead:知道如何委派伴随的sourceSets["main"]-call 吗?
          • val main by sourcesets :)
          • @BenjaminSchmid。好的,这似乎是一个问题,尤其是多模块项目。在单模块项目中,Kotlin DSL 中有一个扩展——sourceSets。但是该访问器似乎没有在多模块项目中生成,可能是由于错误。但是您可以使用委托来获取任何属性(实际上就像 Groovy 中的 methodMissing)。所以这里有一个技巧:val sourcesJar by tasks.creating(Jar::class) { val sourceSets: SourceSetContainer by project; from(sourceSets["main"].allJava); classifier = "sources"; }。不过,我不喜欢它似乎在工作。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-08-29
          • 1970-01-01
          • 1970-01-01
          • 2020-07-29
          • 1970-01-01
          • 2012-07-13
          • 1970-01-01
          相关资源
          最近更新 更多