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
相关产品推荐
相关产品推荐

