【发布时间】:2012-07-13 13:18:46
【问题描述】:
我正在处理一个使用 gradle 构建的开源项目。我想生成一个(项目)-sources.jar 文件,我可以将其加载到我的 IDE(IntelliJ IDEA)中并通过项目进行调试。如果可以生成文件,我知道如何加载文件。
我查看了该项目的可用 gradle 任务,但没有一个可以生成源 jar 文件。
为此项目生成源 jar 文件的最简单方法是什么?
将源代码添加到包含已编译类文件的 jar 文件中也可以。
【问题讨论】:
我正在处理一个使用 gradle 构建的开源项目。我想生成一个(项目)-sources.jar 文件,我可以将其加载到我的 IDE(IntelliJ IDEA)中并通过项目进行调试。如果可以生成文件,我知道如何加载文件。
我查看了该项目的可用 gradle 任务,但没有一个可以生成源 jar 文件。
为此项目生成源 jar 文件的最简单方法是什么?
将源代码添加到包含已编译类文件的 jar 文件中也可以。
【问题讨论】:
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:
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
【讨论】:
假设您在 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 工件。
【讨论】:
JvmPluginsHelper.configureDocumentationVariantWithAritfact(mySourceSet.sourcesElementsConfigurationName, mySourceSet.name, DocsTypes.SOURCES, listOf(), mySourceSet.sourcesJarTaskName, mySourceSet.allSource, mySourceSetComponent, configurations, tasks, serviceOf()。
如果您希望将源代码添加到已编译的类 JAR 文件中,您也说过这是可以接受的,您可以轻松地做到这一点。只需将以下内容添加到您的构建文件中。你可以看到,理论上,这很像将源代码放入单独的 JAR 的解决方案:
jar {
from sourceSets.main.allSource
}
不同之处在于,您通过说“jar”代替 sourcesJar 将其添加到主 JAR 文件中。
【讨论】:
这应该可以工作
assemble.dependsOn 'propertyJar'
task propertyJar(type: Jar) {
archiveName = "myJarName.jar"
from('src/main/resources') {
include '**'
}}
【讨论】:
assemble.dependsOn 部分,这使得这个任务自动运行。
使用时:
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 知道如何解决这个问题吗?
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)
}
}
【讨论】:
Project."java" 解析为 JavaPluginExtension,它不提供任何 sourceSets 或 docsDir 属性。
from(sourceSets["main"].allJava)
from(javadoc) 和 from(sourceSets["main"].allSource)