如何构建源代码 JAR 与 Gradle?

我的工作与一个开源项目,是建立与格拉德尔。我想生成一个 (project)-sources.jar文件,我可以加载到我的 IDE (IntelliJIDEA)和调试通过该项目。我知道如何加载文件,如果我可以生成它。

我已经查看了项目中可用的 Gradle 任务,没有一个生成了 source jar 文件。

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

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

98638 次浏览
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
}

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

 jar {
from sourceSets.main.allSource
}

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

如果你使用 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
}

给你

这应该能行

assemble.dependsOn 'propertyJar'


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

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)
}
}

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插件(现在推荐使用) ,那么这也将发布一个 *-sources.jar构件以及您的 Java 主要发布。

参见 格拉德医生

使用时:

  • 等级: 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

这就是我如何使用 Kotlin DSL(build.gradle.kts)包含 多卡(查看它的 在线)和 我的安卓科特林图书馆的 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)
// ...
}
}
}

安卓:

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

Java:

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