Como criar fontes jar com gradle

155

Estou trabalhando com um projeto de código aberto criado com gradle. Gostaria de gerar um arquivo (project) -sources.jar que eu possa carregar no meu IDE (IntelliJ IDEA) e depurar no projeto. Eu sei como carregar o arquivo, se eu puder gerá-lo.

Examinei as tarefas gradle disponíveis para o projeto e não há uma que gere um arquivo jar de fontes.

Qual é a maneira mais fácil de gerar um arquivo jar de fontes para este projeto?

Adicionar a fonte ao arquivo jar que contém os arquivos de classe compilados também seria bom.

Paul D. Eden
fonte

Respostas:

242
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
}
JB Nizet
fonte
4
Estou aceitando esta resposta com base nos grandes detalhes e suponho que ela funcione em projetos gradle que usam o plugin java. Infelizmente, não funciona no meu caso, pois o projeto que estou usando não usa o plugin java. O erro que recebo é "Não foi possível encontrar a propriedade 'sourceSets' na tarefa ': sourcesJar'."
Paul D. Eden
Caso isso importe, o projeto referido é hsqldb 2.2.8.
Paul D. Eden
Na minha situação, a propriedade AllSource não estava pegando os arquivos .java, eu tive que mudar minha tarefa sourcesJar ao uso: de sourceSets.main.java, sourceSets.main.resources
Doug Ayers
5
Se não me engano, você também não precisa das especificações depende da classe. Gradle examina as entradas de uma tarefa, determina de onde elas vieram e cria automaticamente uma dependência. por exemplo, javadocJar puxa arquivos do javadoc, portanto, Gradle adicionará o javadoc dependente automaticamente.
Mikezx6r
Como posso referenciar os arquivos .jar gerados no Android Studio? Onde eu tenho que colocá-los?
JJD #
54

Se você estiver usando o 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
}

a partir daqui

Giordano
fonte
34

Se você deseja adicionar as fontes ao arquivo JAR das classes compiladas , o que você também disse que seria aceitável, faça isso com bastante facilidade. Basta adicionar o seguinte ao seu arquivo de compilação. Você pode ver que, em teoria, é bastante parecido com a solução para colocar fontes em um JAR separado:

 jar {
     from sourceSets.main.allSource
 }

A diferença é que você o está adicionando ao arquivo JAR principal dizendo "jar" em vez de sourcesJar.

Michael Oryl
fonte
No sistema gradle do Android, estou recebendo este erro: "Não foi possível encontrar o método jar () para argumentos no projeto do tipo org.gradle.api.Project"
iamreptar 21/09/16
@iamreptar Você provavelmente deve perguntar a Giordano (autor da próxima resposta) sobre isso. Não sou desenvolvedor de Android. stackoverflow.com/a/28969412/1480995
Michael Oryl
31

Solução a partir do Gradle 6.0

Supondo que você use o java/ java-libraryplugin com o Gradle 6.0 ou posterior, você pode obter uma sourcesJartarefa usando a seguinte configuração:

java {
    withSourcesJar()
    // and/or analogously use “withJavadocJar()” to get a “javadocJar” task
}

Se você usar adicionalmente o maven-publish/ ivy-publishplugin (recomendado hoje em dia), isso também publicará um *-sources.jarartefato junto com sua publicação Java principal.

Veja também os documentos Gradle .

Chriki
fonte
10

isso deve funcionar

assemble.dependsOn 'propertyJar'

task propertyJar(type: Jar) {
 archiveName = "myJarName.jar"
 from('src/main/resources') {
    include '**'
 }}
Todos
fonte
1
^ para esta assemble.dependsOnparte, o que faz com que esta tarefa seja executada automaticamente.
Jarekczek
3

O equivalente DSL da Kotlin seria:

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)
    }
}
wheleph
fonte
Não está funcionando para mim no Gradle 5.0: Project."java"resolve para o JavaPluginExtensionqual não oferece nenhum sourceSetsou docsDirpropriedades.
amigos estão dizendo sobre bentolor
Tente usarfrom(sourceSets["main"].allJava)
madhead
mudou from(javadoc)efrom(sourceSets["main"].allSource)
Giovanni Silva
Também para a maneira DSL do kotlin, dê uma olhada na resposta: stackoverflow.com/a/60068986/2627884
amatkivskiy