【问题标题】:How to build sources JAR with Gradle?如何使用 gradle 构建源 jar?
【发布时间】:2012-07-13 13:18:46
【问题描述】:

我正在处理一个使用 gradle 构建的开源项目。我想生成一个(项目)-sources.jar 文件,我可以将其加载到我的 IDE(IntelliJ IDEA)中并通过项目进行调试。如果可以生成文件,我知道如何加载文件。

我查看了该项目的可用 gradle 任务,但没有一个可以生成源 jar 文件。

为此项目生成源 jar 文件的最简单方法是什么?

将源代码添加到包含已编译类文件的 jar 文件中也可以。

【问题讨论】:

    标签: java jar gradle


    【解决方案1】:
    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
    }
    

    【讨论】:

    • 我接受了这个答案,基于伟大的细节和我的假设,它适用于使用 java 插件的 gradle 项目。不幸的是,它在我的情况下不起作用,因为我正在使用的项目不使用 java 插件。我得到的错误是“在任务':sourcesJar'上找不到属性'sourceSets'。”
    • 如果重要的话,所指的项目是hsqldb 2.2.8。
    • 在我的情况下,allSource 属性没有获取 .java 文件,我不得不更改我的 sourcesJar 任务以使用:from sourceSets.main.java, sourceSets.main.resources
    • 如果我没记错的话,你也不需要类中的 dependsOn 规范。 Gradle 查看任务的输入,确定它们的来源,并自动创建依赖项。例如javadocJar 从 javadoc 中提取文件,因此 Gradle 会自动添加 dependsOn javadoc。
    • 如何在 Android Studio 中引用生成的 .jar 文件?我必须把它们放在哪里?
    【解决方案2】:

    如果您使用的是 Android:

    task sourcesJar(type: Jar) {
        from android.sourceSets.main.java.srcDirs
        classifier = 'sources'
    }
    
    task javadoc(type: Javadoc) {
        source = android.sourceSets.main.java.srcDirs
        classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
    }
    
    task javadocJar(type: Jar, dependsOn: javadoc) {
        classifier = 'javadoc'
        from javadoc.destinationDir
    }
    
    artifacts {
        archives javadocJar
        archives sourcesJar
    }
    

    来自here

    【讨论】:

      【解决方案3】:

      Gradle 6.0 的解决方案

      假设您在 Gradle 6.0 或更高版本中使用java/java-library 插件,您可以使用以下配置获取sourcesJar 任务:

      java {
          withSourcesJar()
          // and/or analogously use “withJavadocJar()” to get a “javadocJar” task
      }
      

      如果您还使用了maven-publish/ivy-publish 插件(现在推荐),那么这也会与您的主要 Java 出版物一起发布 *-sources.jar 工件。

      另见the Gradle docs

      【讨论】:

      • 这是 Gradle 6.0+ 的理想解决方案,因为这还将创建具有适当功能的适当变体并将它们附加到“java”组件以进行发布。如果您有其他组件或变体,您也可以手动调用内部辅助函数:JvmPluginsHelper.configureDocumentationVariantWithAritfact(mySourceSet.sourcesElementsConfigurationName, mySourceSet.name, DocsTypes.SOURCES, listOf(), mySourceSet.sourcesJarTaskName, mySourceSet.allSource, mySourceSetComponent, configurations, tasks, serviceOf()
      【解决方案4】:

      如果您希望将源代码添加到已编译的类 JAR 文件中,您也说过这是可以接受的,您可以轻松地做到这一点。只需将以下内容添加到您的构建文件中。你可以看到,理论上,这很像将源代码放入单独的 JAR 的解决方案:

       jar {
           from sourceSets.main.allSource
       }
      

      不同之处在于,您通过说“jar”代替 sourcesJar 将其添加到主 JAR 文件中。

      【讨论】:

      • 在 Android 的 gradle 系统中,我收到此错误:“在 org.gradle.api.Project 类型的项目中找不到方法 jar()”
      • @iamreptar 您可能应该向 Giordano(下一个答案的作者)询问这个问题。我不是安卓开发者。 stackoverflow.com/a/28969412/1480995
      【解决方案5】:

      这应该可以工作

      assemble.dependsOn 'propertyJar'
      
      task propertyJar(type: Jar) {
       archiveName = "myJarName.jar"
       from('src/main/resources') {
          include '**'
       }}
      

      【讨论】:

      • ^ 这个assemble.dependsOn 部分,这使得这个任务自动运行。
      【解决方案6】:

      使用时:

      • 等级:5+
      • javamaven-publish 插件
      task sourceJar(type: Jar) {
          from sourceSets.main.allJava
          archiveClassifier = "sources"
      }
      
      publishing {
          publications {
              maven(MavenPublication) {
                  from components.java
                  artifact sourceJar
              }
          }
      }
      

      https://docs.gradle.org/current/dsl/org.gradle.api.publish.maven.MavenPublication.html

      【讨论】:

      • Could not get unknown property 'main' for SourceSet container of type org.gradle.api.internal.tasks.DefaultSourceSetContainer 知道如何解决这个问题吗?
      • @RoshanaPitigala,你用的是什么 Gradle 版本?
      • 我不得不使用“from sourceSets.main.allSources”而不是 .allJava
      【解决方案7】:

      Kotlin DSL 等价物是:

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

      【讨论】:

      • 在 Gradle 5.0 下不适合我:Project."java" 解析为 JavaPluginExtension,它不提供任何 sourceSetsdocsDir 属性。
      • 尝试使用from(sourceSets["main"].allJava)
      • 更改了 from(javadoc)from(sourceSets["main"].allSource)
      • 另外,对于 kotlin DSL 方式,请查看答案:stackoverflow.com/a/60068986/2627884
      猜你喜欢
      • 2019-03-06
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 2021-03-18
      • 2023-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多