DATAONLINE.IO.VN

https://365.io.vn

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

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

Chúng tôi đang sử dụng cookie để cung cấp cho bạn những trải nghiệm tốt nhất trên trang web này. Bằng cách tiếp tục truy cập, bạn đồng ý với Chính sách thu thập và sử dụng cookie của chúng tôi.
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