You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gradle打包JNI本地库:如何将指定目录下的所有DLL文件打包到JAR根目录

Gradle: 打包指定本地DLL到JAR根目录

你遇到的核心问题是对Gradle中include函数的用法理解偏差——它是基于资源源目录的相对路径匹配,而非绝对路径。另外直接在sourceSets.resources里遍历绝对路径的方式不符合Gradle的资源配置逻辑,所以无法生效。下面给你两种简洁且满足需求的解决方案,优先推荐第一种(更直接针对JAR打包):

方案一:直接在jar任务中配置(推荐)

jar任务是专门负责生成JAR文件的,在这里配置打包规则最精准,也能避免和其他资源配置冲突。添加以下代码到你的build.gradle:

jar {
    // 指定本地库的根来源目录
    from "${buildDir}/libs/"
    // 递归匹配所有子目录下的.dll文件(自动适配数量和名称变化)
    include "**/*.dll"
    // 显式排除不需要的.ext和.lib文件(可选,但更保险)
    exclude "**/*.ext", "**/*.lib"
    // 将匹配到的DLL直接放到JAR的根目录
    into ""
}

关键逻辑说明:

  • from "${buildDir}/libs/":告诉Gradle从build/libs目录下加载待打包的文件;
  • include "**/*.dll":**表示递归匹配任意子目录,*.dll匹配所有DLL文件,不管你的本地库数量、名称、平台目录如何变化,只要是DLL都会被选中;
  • into "":指定将这些文件输出到JAR的根目录(如果不设置,默认会保留原有的目录层级,比如win32/shared/x64/mylibrary.dll,这不符合你的需求)。

方案二:通过sourceSets配置资源

如果你更习惯通过资源集合来管理,也可以修改sourceSets的配置,核心是先把build/libs加入资源源目录,再用相对路径匹配:

sourceSets {
    main {
        resources {
            // 将本地库目录添加到资源源目录列表
            srcDirs += "${buildDir}/libs"
            // 只保留所有子目录下的DLL文件
            include "**/*.dll"
            // 排除不需要的文件格式
            exclude "**/*.ext", "**/*.lib"
            // 输出到JAR根目录(默认资源就是输出到根目录,这行可省略)
            into ""
        }
    }
}

注意事项:

如果你的x64和x86目录下存在同名的DLL文件(比如都叫mylibrary.dll),打包到JAR根目录时会发生覆盖,最终只会保留最后一个被处理的文件。如果需要区分平台,你可以考虑修改into参数,比如into "win32/x64"和into "win32/x86",但这会打破“根目录层级”的需求——如果这是你需要的场景,可以再调整配置。

验证方法:执行./gradlew jar(Windows下是gradlew.bat jar),然后解压生成的JAR文件,检查根目录是否只包含你需要的DLL文件。

内容的提问来源于stack exchange,提问作者Orbyfied

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 11:07:46