Gradle如何获取默认资源目录并添加文件?OpenVR原生库自动下载问题
在Gradle中管理资源目录并添加下载的原生库
我来帮你搞定这个问题!首先得明确:Gradle里的默认资源目录取决于你用的插件,咱们分场景说,再结合你的OpenVR下载需求给出具体实现:
先搞清楚默认资源目录
- 如果你是Kotlin/JVM项目(你的OpenVR端口大概率属于这类),默认资源目录是
src/main/resources - 如果是Android项目,原生库更适合放在
src/main/jniLibs(而非普通资源目录),普通资源目录则是src/main/res或src/main/resources
下面给你两种可行方案,按需选择:
方案1:把下载的库复制到默认资源目录
这种方式会将文件直接同步到源码目录的资源文件夹,适合需要文件持久化在项目里的场景。
你可以先通过Gradle的sourceSets获取默认资源目录路径,再创建一个依赖下载任务的复制任务:
// 示例用Kotlin DSL,Groovy DSL语法只需微调 plugins { id("java") kotlin("jvm") id("de.undercouch.download") version "5.4.0" // 确保已应用下载插件 } // 获取默认资源目录的绝对路径 val mainResourcesDir = sourceSets.main.get().resources.sourceDirectories.first() task downloadNatives { doLast { // 你的现有下载逻辑,这里补充完整示例: val dirBin = "https://api.github.com/repos/ValveSoftware/openvr/contents/bin" val contentLinux32 = File(buildDir, "directoryContents_linux32.json") download { src("$dirBin/linux32") dest(contentLinux32) } // 解析JSON后下载具体库文件(示例) val nativeLibUrl = "https://github.com/ValveSoftware/openvr/raw/master/bin/linux32/libopenvr_api.so" val downloadedLibDir = File(buildDir, "natives/linux32") downloadedLibDir.mkdirs() download { src(nativeLibUrl) dest(downloadedLibDir) overwrite(true) } } } // 创建复制任务,依赖下载任务确保顺序 task copyNativesToResources(type: Copy) { dependsOn(downloadNatives) from("$buildDir/natives") // 下载好的库所在目录 into("$mainResourcesDir/natives") // 资源目录下的子目录,方便归类 include("**/*.so", "**/*.dll", "**/*.dylib") // 只复制原生库文件 } // 让编译任务依赖复制任务,确保编译时资源已就绪 tasks.compileKotlin { dependsOn(copyNativesToResources) }
方案2:把下载目录直接设为额外资源目录
这种方式不需要复制文件,让Gradle直接把build目录下的下载文件夹当成资源目录的一部分,适合不想污染源码目录的场景:
plugins { id("java") kotlin("jvm") id("de.undercouch.download") version "5.4.0" } task downloadNatives { doLast { val nativesDir = File(buildDir, "natives") nativesDir.mkdirs() // 下载逻辑示例,将库文件存到build/natives下 val nativeLibUrl = "https://github.com/ValveSoftware/openvr/raw/master/bin/linux32/libopenvr_api.so" download { src(nativeLibUrl) dest(File(nativesDir, "linux32")) overwrite(true) } } } // 配置sourceSets,添加下载目录为资源源目录 sourceSets.main { resources { srcDir(File(buildDir, "natives")) include("**/*.so", "**/*.dll", "**/*.dylib") // 只包含原生库文件 } } // 让资源处理任务依赖下载任务,确保资源目录已准备好 tasks.processResources { dependsOn(downloadNatives) }
额外提醒
- 如果是Android项目,原生库优先用
jniLibs目录,可通过sourceSets.main.jniLibs.srcDirs.add(File(buildDir, "natives"))配置 - 可以通过执行
./gradlew sourceSets命令,查看所有已配置的资源目录,确认是否生效
内容的提问来源于stack exchange,提问作者elect
相关产品推荐
相关产品推荐

