gradle로 소스 jar을 빌드하는 방법


155

gradle로 빌드 된 오픈 소스 프로젝트로 작업하고 있습니다. IDE (IntelliJ IDEA)에로드하고 프로젝트를 통해 디버깅 할 수있는 (프로젝트) -sources.jar 파일을 생성하고 싶습니다. 파일을 생성 할 수 있으면로드하는 방법을 알고 있습니다.

프로젝트에 사용 가능한 gradle 작업을 살펴 ​​보았고 소스 jar 파일을 생성하는 gradle 작업이 없습니다.

이 프로젝트의 소스 jar 파일을 생성하는 가장 쉬운 방법은 무엇입니까?

컴파일 된 클래스 파일을 포함하는 jar 파일에 소스를 추가하는 것도 좋습니다.

답변:


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
}

4
나는 훌륭한 답변과 자바 플러그인을 사용하는 gradle 프로젝트에서 작동한다고 가정 하여이 답변을 수락하고 있습니다. 불행히도, 사용중인 프로젝트가 Java 플러그인을 사용하지 않으므로 제 경우에는 작동하지 않습니다. 내가 얻는 오류는 "태스크 ': sourcesJar'에서 'sourceSets'속성을 찾을 수 없습니다."입니다.
Paul D. Eden

중요한 경우 참조되는 프로젝트는 hsqldb 2.2.8입니다.
Paul D. Eden

내 상황에서, allSource 속성이 된 .java 파일을 따기되지 않은, 내가 사용 내 sourcesJar 작업을 변경했다 : sourceSets.main.java, sourceSets.main.resources에서
더그 에어즈

5
내가 실수하지 않으면 클래스의 dependOn 사양이 필요하지 않습니다. Gradle은 작업에 대한 입력을보고 작업의 위치를 ​​결정하고 자동으로 종속성을 만듭니다. 예를 들어 javadocJar는 javadoc에서 파일을 가져 오므로 Gradle은 dependOn javadoc을 자동으로 추가합니다.
Mikezx6r

Android Studio에서 생성 된 .jar 파일을 어떻게 참조 할 수 있습니까? 어디에 두어야합니까?
JJD

54

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
}

에서 여기


34

컴파일 된 클래스 JAR 파일에 소스추가 하려는 경우 에도이를 충분히 수행 할 수 있습니다. 빌드 파일에 다음을 추가하십시오. 이론적으로 소스를 별도의 JAR에 넣는 솔루션과 매우 비슷하다는 것을 알 수 있습니다.

 jar {
     from sourceSets.main.allSource
 }

차이점은 sourcesJar 대신 "jar"라고 말하여 기본 JAR 파일에 추가한다는 것입니다.


Android의 gradle 시스템에서 다음 오류가 발생합니다. "org.gradle.api.Project 유형의 프로젝트에서 인수에 대한 메소드 jar ()를 찾을 수 없습니다"
iamreptar

@iamreptar 대신 Giordano (다음 답변 작성자)에게 문의하십시오. 저는 안드로이드 개발자가 아닙니다. stackoverflow.com/a/28969412/1480995
Michael Oryl

31

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플러그인 을 추가로 사용하는 경우 (현재 권장 됨)*-sources.jar 기본 Java 발행물과 함께 아티팩트 .

Gradle 문서 도 참조하십시오 .


10

이 작동합니다

assemble.dependsOn 'propertyJar'

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

1
^이 assemble.dependsOn부분은이 작업이 자동으로 실행되도록합니다.
Jarekczek

3

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

변경 from(javadoc)from(sourceSets["main"].allSource)
Giovanni 실바

: 또한 코 틀린 DSL 방식에 대한 대답에 좀 제발 stackoverflow.com/a/60068986/2627884
amatkivskiy

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.