“MỌI SỰ CỐ GẮNG CHƯA CHẮC ĐÃ GẶT HÁI ĐƯỢC KẾT QUẢ NHƯNG MỖI KẾT QUẢ ĐẠT ĐƯỢC CHẮC CHẮN LÀ CẢ MỘT QUÁ TRÌNH CỐ GẮNG”

Java Gradle đóng gói tệp .jar tự chạy khi nháy đúp chuột

Thứ bảy - 08/02/2025 02:58

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

Java Gradle đóng gói tệp .jar tự chạy khi nháy đúp chuột

  1. Các thư viện nằm trong thư mục lib riêng
/* 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

Tổng số điểm của bài viết là: 0 trong 0 đánh giá

Click để đánh giá bài viết
Thống kê
  • Đang truy cập4
  • Hôm nay1,521
  • Tháng hiện tại79,256
  • Tổng lượt truy cập9,170,799
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây