关于Java:如何使用Gradle构建源jar

How to build sources jar with gradle

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

我浏览了该项目可用的gradle任务,但没有一个可生成source jar文件的任务。

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

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


1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
}


如果您使用的是Android:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
}

从这里


如果您希望将源添加到已编译的类JAR文件中(您也说可以接受),则可以轻松完成此操作。只需将以下内容添加到您的构建文件中即可。您可以看到,从理论上讲,这就像将源放入单独的JAR的解决方案一样:

1
2
3
 jar {
     from sourceSets.main.allSource
 }

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


这应该工作

1
2
3
4
5
6
7
assemble.dependsOn 'propertyJar'

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


从Gradle 6.0开始的解决方案

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

1
2
3
4
java {
    withSourcesJar()
    // and/or analogously use"withJavadocJar()" to get a"javadocJar" task
}

如果您另外使用maven-publish / ivy-publish插件(当今推荐),那么这还将与您的主要Java出版物一起发布*-sources.jar工件。

另请参阅Gradle文档。


Kotlin DSL等效项为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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)
    }
}


使用时:

  • 摇篮:5+
  • javamaven-publish插件
1
2
3
4
5
6
7
8
9
10
11
12
13
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