ChatGPT解决这个技术问题 Extra ChatGPT

如何使用 Gradle 构建源 JAR?

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

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

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

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

这是一个similar post

J
JB Nizet
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 会自动添加dependOn javadoc。
如何在 Android Studio 中引用生成的 .jar 文件?我必须把它们放在哪里?
C
Chriki

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()
G
Giordano

如果您使用的是安卓:

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


M
Michael Oryl

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

 jar {
     from sourceSets.main.allSource
 }

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


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

这应该工作

assemble.dependsOn 'propertyJar'

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

用于此 assemble.dependsOn 部分,它使此任务自动运行。
A
Artem Areshko

使用时:

等级:5+

java 和 maven-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 版本?
我不得不使用“来自 sourceSets.main.allSources”而不是 .allJava
w
wheleph

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" 解析为不提供任何 sourceSetsdocsDir 属性的 JavaPluginExtension
尝试使用 from(sourceSets["main"].allJava)
更改了 from(javadoc)from(sourceSets["main"].allSource)
对于 kotlin DSL 方式,请查看答案:stackoverflow.com/a/60068986/2627884
M
Mahozad

这就是我使用 Kotlin DSL (build.gradle.kts) 包含 Dokka(查看它 online)和为 my Android Kotlin library 提供 JAR 的方式:

plugins {
    // ...
    id("org.jetbrains.dokka") version "1.4.32"
    id("maven-publish")
}

lateinit var sourcesArtifact: PublishArtifact
lateinit var javadocArtifact: PublishArtifact

tasks {
    val sourcesJar by creating(Jar::class) {
        archiveClassifier.set("sources")
        from(android.sourceSets["main"].java.srcDirs)
    }
    val dokkaHtml by getting(org.jetbrains.dokka.gradle.DokkaTask::class)
    val javadocJar by creating(Jar::class) {
        dependsOn(dokkaHtml)
        archiveClassifier.set("javadoc")
        from(dokkaHtml.outputDirectory)
    }
    artifacts {
        sourcesArtifact = archives(sourcesJar)
        javadocArtifact = archives(javadocJar)
    }
}

publishing {
    // ...
    publications {
        create<MavenPublication>("MyPublication") {
            from(components["release"])
            artifact(sourcesArtifact)
            artifact(javadocArtifact)
            // ...
        }
    }
}

N
NickUnuchek

安卓:

  task androidSourcesJar(type: Jar) {
        getArchiveClassifier().set('sources')
        from android.sourceSets.main.java.srcDirs//full sources
  }

爪哇:

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