如何使用 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+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 版本?
我不得不使用“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
,它不提供任何 sourceSets
或 docsDir
属性。
尝试使用from(sourceSets["main"].allJava)
更改了 from(javadoc)
和 from(sourceSets["main"].allSource)
另外,对于 kotlin DSL 方式,请查看答案:***.com/a/60068986/2627884以上是关于如何使用 gradle 构建源 jar?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 Gradle 复制 jar 的情况下将一个模块的源包含在另一个模块中?
如何使用 Gradle 构建名称中没有“-SNAPSHOT”的 jar?
如何使用来自 Ktor Kotlin/Java 应用程序的 gradle 构建有效的 JAR 文件