Java Gradle đóng gói tệp .jar tự chạy khi nháy đúp chuột
Java Gradle đóng gói tệp .jar tự chạy khi nháy đúp chuột
/* Cấu hình Gradle để đóng gói myapp.jar
Giữ lại các thư viện trong thư mục lib/
*/
jar {
manifest {
attributes(
'Main-Class': 'controller.frmMain', // Thay bằng class chính của bạn
'Class-Path': configurations.runtimeClasspath.files.collect { 'lib/' + it.name }.join(' ') //Tự động load tên các thư viện vào
)
}
}
task copyLibs(type: Copy) {
from configurations.runtimeClasspath
into "$buildDir/libs/lib"
}
build.dependsOn copyLibs
Tệp build.gradle đầy đủ
plugins {
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}
compileJava {options.encoding = "UTF-8"}
compileTestJava {options.encoding = "UTF-8"}
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
/* Offline thư mục mylibs cùng cấp với thư mục mã nguồn src*/
implementation files('mylibs/OptionPane.jar')
implementation files('mylibs/ReadNumber.jar')
/*Online*/
//implementation 'net.sf.ucanaccess:ucanaccess:5.0.1'
implementation 'org.xerial:sqlite-jdbc:3.44.1.0'
// runtimeOnly 'org.xerial:sqlite-jdbc:3.44.1.0'
implementation 'org.slf4j:slf4j-simple:2.0.9' // Dùng SLF4J với console output
}
// Apply a specific Java toolchain to ease working on different environments.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
application {
// Define the main class for the application.
mainClass = 'controller.frmMain'
}
/* Cấu hình Gradle để đóng gói myapp.jar
Giữ lại các thư viện trong thư mục lib/
*/
jar {
manifest {
attributes(
'Main-Class': 'controller.frmMain', // Thay bằng class chính của bạn
'Class-Path': configurations.runtimeClasspath.files.collect { 'lib/' + it.name }.join(' ')
)
}
}
task copyLibs(type: Copy) {
from configurations.runtimeClasspath
into "$buildDir/libs/lib"
}
build.dependsOn copyLibs
tasks.named('test') {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
2) Đóng gói chỉ định một số tệp thư viện cùng với tệp .jar; còn lại nằm trong thư mục riêng lib
/* Cấu hình Gradle để đóng gói OptionPane.jar và ReadNumber.jar vào myapp.jar
Sửa cấu hình Gradle để đóng gói thư viện cụ thể vào myapp.jar.
Giữ lại các thư viện khác trong thư mục lib/
*/
jar {
manifest {
attributes(
'Main-Class': 'controller.frmMain', // Thay bằng class chính của bạn
'Class-Path': configurations.runtimeClasspath.files
.findAll {
// Loại trừ OptionPane.jar và ReadNumber.jar khỏi Class-Path
!it.name.startsWith('OptionPane.jar') && !it.name.startsWith('ReadNumber.jar')
}
.collect { 'lib/' + it.name } // Các thư viện còn lại trong thư mục lib
.join(' ') // Liệt kê các thư viện trong Class-Path
)
}
// Đưa các thư mục OptionPane và ReadNumber đã giải nén vào .jar
from(zipTree('mylibs/OptionPane.jar')) {
into '' // Đưa các tệp trong OptionPane.jar vào thư mục libs/OptionPane bên trong .jar
}
from(zipTree('mylibs/ReadNumber.jar')) {
into '' // Đưa các tệp trong ReadNumber.jar vào thư mục libs/ReadNumber bên trong .jar
}
// Sao chép các thư viện khác vào thư mục lib ngoài .jar
from {
duplicatesStrategy = DuplicatesStrategy.INCLUDE
configurations.runtimeClasspath.filter {
// Loại trừ OptionPane.jar và ReadNumber.jar khỏi việc sao chép
!it.name.equals('OptionPane.jar') && !it.name.equals('ReadNumber.jar')
}.collect {
it.isDirectory() ? it : zipTree(it)
}
}
}
task copyLibs(type: Copy) {
from configurations.runtimeClasspath.filter {
// Loại bỏ OptionPane.jar và ReadNumber.jar khi sao chép vào thư mục lib/
!it.name.equals('OptionPane.jar') && !it.name.equals('ReadNumber.jar')
}
into "$buildDir/libs/lib"
}
build.dependsOn copyLibs
Tệp build.gradle đầy đủ
plugins {
// Apply the application plugin to add support for building a CLI application in Java.
id 'application'
}
compileJava {options.encoding = "UTF-8"}
compileTestJava {options.encoding = "UTF-8"}
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
/* Offline thư mục mylibs cùng cấp với thư mục mã nguồn src*/
implementation files('mylibs/OptionPane.jar')
implementation files('mylibs/ReadNumber.jar')
/*Online*/
//implementation 'net.sf.ucanaccess:ucanaccess:5.0.1'
implementation 'org.xerial:sqlite-jdbc:3.44.1.0'
// runtimeOnly 'org.xerial:sqlite-jdbc:3.44.1.0'
implementation 'org.slf4j:slf4j-simple:2.0.9' // Dùng SLF4J với console output
}
// Apply a specific Java toolchain to ease working on different environments.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
application {
// Define the main class for the application.
mainClass = 'controller.frmMain'
}
/* Cấu hình Gradle để đóng gói OptionPane.jar và ReadNumber.jar vào myapp.jar
Sửa cấu hình Gradle để đóng gói thư viện cụ thể vào myapp.jar.
Giữ lại các thư viện khác trong thư mục lib/
*/
jar {
manifest {
attributes(
'Main-Class': 'controller.frmMain', // Thay bằng class chính của bạn
'Class-Path': configurations.runtimeClasspath.files
.findAll {
// Loại trừ OptionPane.jar và ReadNumber.jar khỏi Class-Path
!it.name.startsWith('OptionPane.jar') && !it.name.startsWith('ReadNumber.jar')
}
.collect { 'lib/' + it.name } // Các thư viện còn lại trong thư mục lib
.join(' ') // Liệt kê các thư viện trong Class-Path
)
}
// Đưa các thư mục OptionPane và ReadNumber đã giải nén vào .jar
from(zipTree('mylibs/OptionPane.jar')) {
into '' // Đưa các tệp trong OptionPane.jar vào thư mục libs/OptionPane bên trong .jar
}
from(zipTree('mylibs/ReadNumber.jar')) {
into '' // Đưa các tệp trong ReadNumber.jar vào thư mục libs/ReadNumber bên trong .jar
}
// Sao chép các thư viện khác vào thư mục lib ngoài .jar
from {
duplicatesStrategy = DuplicatesStrategy.INCLUDE
configurations.runtimeClasspath.filter {
// Loại trừ OptionPane.jar và ReadNumber.jar khỏi việc sao chép
!it.name.equals('OptionPane.jar') && !it.name.equals('ReadNumber.jar')
}.collect {
it.isDirectory() ? it : zipTree(it)
}
}
}
task copyLibs(type: Copy) {
from configurations.runtimeClasspath.filter {
// Loại bỏ OptionPane.jar và ReadNumber.jar khi sao chép vào thư mục lib/
!it.name.equals('OptionPane.jar') && !it.name.equals('ReadNumber.jar')
}
into "$buildDir/libs/lib"
}
build.dependsOn copyLibs
tasks.named('test') {
// Use JUnit Platform for unit tests.
useJUnitPlatform()
}
Tác giả: Vàng Văn Quyn
Những tin cũ hơn
- Click vào nút hiển thị ngày trong tuần hoặc tháng âm lịch để xem chi tiết
- Màu đỏ: Ngày tốt
- Xanh lá: Đầu tháng âm lịch
- Màu vàng: Ngày hiện tại