Làm thế nào để xây dựng jar jar với gradle


155

Tôi đang làm việc với một dự án nguồn mở được xây dựng với gradle. Tôi muốn tạo một tệp (dự án) -source.jar mà tôi có thể tải vào IDE (IntelliJ IDEA) của mình và gỡ lỗi thông qua dự án. Tôi biết cách tải tập tin nếu tôi có thể tạo nó.

Tôi đã xem qua các nhiệm vụ lớp có sẵn cho dự án và không có nhiệm vụ nào tạo ra tệp jar nguồn.

Cách dễ nhất để tạo một tệp jar nguồn cho dự án này là gì?

Thêm nguồn vào tệp jar chứa các tệp lớp đã biên dịch cũng sẽ tốt.

Câu trả lời:


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
Tôi chấp nhận câu trả lời này dựa trên các chi tiết cụ thể tuyệt vời và giả định của tôi là nó hoạt động trên các dự án phân lớp sử dụng plugin java. Thật không may, nó không hoạt động trong trường hợp của tôi vì dự án tôi đang sử dụng không sử dụng plugin java. Lỗi tôi nhận được là "Không thể tìm thấy thuộc tính 'sourceSets' trên tác vụ ': nguồnJar'."
Paul D. Eden

Trong trường hợp có vấn đề, dự án được đề cập là hsqldb 2.2.8.
Paul D. Eden

Trong tình huống của tôi, thuộc tính allSource không chọn các tệp .java, tôi đã phải thay đổi tác vụ nguồnJar của mình để sử dụng: từ sourceSets.main.java, sourceSets.main.resource
Doug Ayers

5
Nếu tôi không nhầm, bạn cũng không cần các thông số kỹ thuật phụ thuộc trong lớp. Gradle xem xét các yếu tố đầu vào cho một nhiệm vụ, xác định nơi chúng đến và tự động tạo ra sự phụ thuộc. ví dụ: javadocJar lấy các tệp từ javadoc, do đó Gradle sẽ tự động thêm phụ thuộc vào javadoc.
Mikezx6r

Làm cách nào tôi có thể tham chiếu các tệp .jar được tạo trong Android Studio? Tôi phải đặt chúng ở đâu?
JJD

54

Nếu bạn đang sử dụng 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
}

từ đây


34

Nếu bạn muốn thêm các nguồn vào tệp JAR của lớp đã biên dịch , mà bạn cũng nói sẽ được chấp nhận, bạn có thể làm điều đó đủ dễ dàng. Chỉ cần thêm sau đây vào tập tin xây dựng của bạn. Bạn có thể thấy rằng, về mặt lý thuyết, nó khá giống như giải pháp đưa các nguồn vào một JAR riêng:

 jar {
     from sourceSets.main.allSource
 }

Sự khác biệt là bạn đang thêm nó vào tệp JAR chính bằng cách nói "jar" thay cho nguồnJar.


Trong hệ thống phân loại của Android, tôi gặp lỗi này: "Không thể tìm thấy jar phương thức () cho các đối số trong dự án loại org.gradle.api.Project"
iamreptar

@iamreptar Có lẽ bạn nên hỏi Giordano (tác giả của câu trả lời tiếp theo) về điều đó thay vào đó. Tôi không phải là nhà phát triển Android. stackoverflow.com/a/28969412/1480995
Michael Oryl

31

Giải pháp cho Lớp 6.0

Giả sử rằng bạn sử dụng java/ java-libraryplugin với Gradle 6.0 trở lên, bạn có thể nhận một sourcesJartác vụ bằng cách sử dụng cấu hình sau:

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

Nếu bạn sử dụng thêm maven-publish/ ivy-publishplugin (được khuyến nghị hiện nay), thì điều này cũng sẽ xuất bản một *-sources.jartạo phẩm cùng với ấn phẩm Java chính của bạn.

Xem thêm các tài liệu Gradle .


10

cái này nên hoạt động

assemble.dependsOn 'propertyJar'

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

1
^ cho assemble.dependsOnphần này , làm cho nhiệm vụ này chạy tự động.
Jarekczek

3

Tương đương DSL của Kotlin sẽ là:

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

Không làm việc cho tôi theo Lớp 5.0: Project."java"giải quyết JavaPluginExtensionmà không cung cấp bất kỳ sourceSetshoặc docsDirthuộc tính nào.
bentolor

Hãy thử sử dụngfrom(sourceSets["main"].allJava)
madhead 4/12/18

đã thay đổi from(javadoc)from(sourceSets["main"].allSource)
Giovanni Silva

Ngoài ra đối với cách DSL của kotlin, vui lòng xem câu trả lời: stackoverflow.com/a/60068986/2627884
amatkivskiy

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.