Như những người khác đã lưu ý, để tệp jar có thể thực thi được, điểm nhập của ứng dụng phải được đặt trong Main-Class
thuộc tính của tệp kê khai. Nếu các tệp lớp phụ thuộc không được đối chiếu, thì chúng cần được đặt trong Class-Path
mục nhập của tệp kê khai.
Tôi đã thử tất cả các loại kết hợp plugin và những gì không phải cho nhiệm vụ đơn giản là tạo một jar thực thi và bằng cách nào đó, bao gồm cả các phụ thuộc. Tất cả các plugin dường như thiếu cách này hay cách khác, nhưng cuối cùng tôi đã nhận được nó như tôi muốn. Không có tập lệnh bí ẩn, không phải một triệu tệp nhỏ khác nhau gây ô nhiễm thư mục bản dựng, tệp tập lệnh xây dựng khá sạch và trên hết: không phải là một triệu tệp lớp bên thứ ba nước ngoài được hợp nhất vào kho lưu trữ jar của tôi.
Sau đây là một bản sao-dán từ đây để thuận tiện cho bạn ..
[Cách thực hiện] tạo tệp zip phân phối với các tệp phụ thuộc trong thư mục con /lib
và thêm tất cả các phụ thuộc vào Class-Path
mục nhập trong tệp kê khai:
apply plugin: 'java'
apply plugin: 'java-library-distribution'
repositories {
mavenCentral()
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.3.2'
}
// Task "distZip" added by plugin "java-library-distribution":
distZip.shouldRunAfter(build)
jar {
// Keep jar clean:
exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF'
manifest {
attributes 'Main-Class': 'com.somepackage.MainClass',
'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ')
}
// How-to add class path:
// /programming/22659463/add-classpath-in-manifest-using-gradle
// https://gist.github.com/simon04/6865179
}
Lưu trữ như một ý chính ở đây .
Kết quả có thể được tìm thấy build/distributions
và nội dung được giải nén trông như thế này:
lib / commons-lang3-3.3.2.jar
MyJarFile.jar
Nội dung của MyJarFile.jar#META-INF/MANIFEST.mf
:
Manifest-Phiên bản: 1.0
Main-Class: com.somepackage.MainClass
Class-Path: lib / commons-lang3-3.3.2.jar