如何使用 gradle 构建源 jar?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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(下一个答案的作者)询问这个问题。我不是安卓开发者。 ***.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 方式,请查看答案:***.com/a/60068986/2627884

以上是关于如何使用 gradle 构建源 jar?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用具有依赖关系的gradle构建jar文件

如何在不使用 Gradle 复制 jar 的情况下将一个模块的源包含在另一个模块中?

如何使用 Gradle 构建名称中没有“-SNAPSHOT”的 jar?

如何使用来自 Ktor Kotlin/Java 应用程序的 gradle 构建有效的 JAR 文件

如何使用 Spring Boot Gradle Plugin 2.1.* 构建不可执行的 jar(库)

如何使用gradle构建工具打包groovy脚本成jar文件