2013-05-04 23 views
7

Tôi muốn tạo một nhiệm vụ mới trong dự án của mình tạo một tệp lưu trữ jar với các tệp lớp của dự án của tôi và các tệp lớp của phụ thuộc (còn được gọi là 'lọ bóng mờ' hoặc 'bình chứa chất béo').Gradle: nhiệm vụ jar bản gốc 'clone' để tạo một nhiệm vụ mới cho một lọ bao gồm các phụ thuộc

Giải pháp bởi các sách dạy nấu ăn Gradle đề xuất sửa đổi các nhiệm vụ bình chuẩn của JavaPlugin:

jar { 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

Tuy nhiên, tôi muốn giữ taks jar gốc vì nó và có một nhiệm vụ bổ sung cho jar shaeded , nghĩa là tác vụ hoạt động chính xác như tác vụ jar, nhưng bao gồm các tệp bổ sung theo

from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 

và có một trình phân loại khác ('tô bóng').

tôi đã cố gắng để tiếp nhận các cấu hình của nhiệm vụ jar bằng cách sao chép các thuộc tính như thế này:

task shadedJar(type: Jar, dependsOn: configurations.compile) { 
    dependencies = tasks.jar.taskDependencies 
    source = tasks.jar.source 
    manifest = tasks.jar.manifest 
    includes = tasks.jar.includes 
    classifier = 'shaded' 

    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

Nhưng nhiệm vụ dẫn đến không đi qua sự phụ thuộc của 'jar' và jar kết quả không bao gồm các tệp lớp của dự án. Ngoài ra, cách tiếp cận này có vẻ cồng kềnh là cách được khuyến nghị sử dụng tác vụ hiện có làm mẫu cho mẫu mới.

Cách tiếp cận được đề xuất cho nhu cầu cụ thể của tôi (nhiệm vụ shadedJar riêng biệt) và cho các tác vụ 'nhân bản' để sử dụng chúng làm mẫu cho nhiệm vụ bổ sung nói chung là gì?

(Tôi hiện vẫn còn trên Gradle 1.3, nhưng các giải pháp cho các phiên bản Gradle hiện cũng được chào đón)

Trả lời

8

Không có cách nào tích hợp để sao chép nhiệm vụ. Tuy nhiên, thật dễ dàng để cấu hình các nhiệm vụ fatJar để bao gồm các tập tin giống như nhiệm vụ java plugin jar:

task fatJar(type: Jar) { 
    appendix = "fat" 
    from sourceSets.main.output // that's it 
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } 
} 

công tác autowiring sẽ tự động thiết lập sự phụ thuộc nhiệm vụ cần thiết.

Nếu xây dựng kịch bản tiếp tục tùy chỉnh nhiệm vụ jar, bạn có thể áp dụng các tùy chỉnh cho cả hai nhiệm vụ cùng một lúc:

configure([jar, fatJar]) { 
    version = "2.0" 
    entryCompression = "STORED" 
} 

Nếu, không giống như trong trường hợp jar nhiệm vụ, bạn đang định "mẫu" cho mình , bạn có thể "tạo nhanh" bằng phương pháp nhà máy:

def getMeAnotherOne(String name) { 
    task(name, type: Jar) { 
     version = "2.0" 
     entryCompression = "STORED" 
    } 
} 

getMeAnotherOne("jar1") 
getMeAnotherOne("jar2") 
Các vấn đề liên quan