SBT插件或替代方案:编译阶段单独下载远程Zip文件
SBT插件或替代方案:编译阶段单独下载远程Zip文件
嗨,我来帮你搞定这个需求!其实你完全不需要依赖专门的SBT插件,自己在项目里定义一个自定义任务就能轻松实现只下载远程Zip文件、不解压的功能,还能把这个任务绑定到编译阶段之前自动执行。下面给你两种实现方式,你可以根据需求选:
方式一:用Java标准库实现(无额外依赖)
这种方案不需要引入任何第三方库,直接用Java自带的IO和网络API就能完成下载。在你的build.sbt里添加以下代码:
// 配置远程Zip地址和本地保存路径 val remoteZipUrl = "https://example.com/your-target-file.zip" // 替换成你的实际Zip地址 val downloadDirectory = file("target/downloaded-zips") // 下载文件的存放目录,可自定义 val localZipFile = downloadDirectory / "my-downloaded.zip" // 保存的文件名 // 定义下载任务 val downloadZipTask = taskKey[Unit]("Downloads remote zip file without extracting") downloadZipTask := { // 先确保存放目录存在 if (!downloadDirectory.exists()) downloadDirectory.mkdirs() // 建立网络连接并下载文件 val url = new java.net.URL(remoteZipUrl) val connection = url.openConnection() // 设置超时(可选,避免长时间等待) connection.setConnectTimeout(5000) connection.setReadTimeout(10000) val inputStream = connection.getInputStream() val outputStream = new java.io.FileOutputStream(localZipFile) try { val buffer = new Array[Byte](1024) var bytesRead = inputStream.read(buffer) while (bytesRead != -1) { outputStream.write(buffer, 0, bytesRead) bytesRead = inputStream.read(buffer) } println(s✅ Zip文件已成功下载到:${localZipFile.getAbsolutePath}") } finally { // 确保流关闭,避免资源泄漏 inputStream.close() outputStream.close() } } // 将下载任务绑定到编译阶段前执行 compile in Compile := (compile in Compile).dependsOn(downloadZipTask).value
方式二:用Apache Commons IO简化代码(更简洁)
如果你觉得上面的IO流处理有点繁琐,可以用Apache Commons IO库来简化代码,只需要添加少量依赖:
- 首先在
project/plugins.sbt里添加依赖:
libraryDependencies += "commons-io" % "commons-io" % "2.15.1" // 可以用最新版本
- 然后在
build.sbt里定义更简洁的下载任务:
val remoteZipUrl = "https://example.com/your-target-file.zip" val downloadDirectory = file("target/downloaded-zips") val localZipFile = downloadDirectory / "my-downloaded.zip" val downloadZipTask = taskKey[Unit]("Downloads remote zip file without extracting") downloadZipTask := { if (!downloadDirectory.exists()) downloadDirectory.mkdirs() // 一行代码搞定下载 org.apache.commons.io.FileUtils.copyURLToFile( new java.net.URL(remoteZipUrl), localZipFile, 5000, // 连接超时(毫秒) 10000 // 读取超时(毫秒) ) println(s✅ Zip文件已成功下载到:${localZipFile.getAbsolutePath}") } // 绑定到编译阶段 compile in Compile := (compile in Compile).dependsOn(downloadZipTask).value
为什么不推荐专门的插件?
其实目前很少有专门只做下载Zip文件的SBT插件,因为自定义任务的实现成本极低,而且能完全掌控下载逻辑(比如超时设置、路径自定义、重复下载判断等)。如果后续你需要扩展功能(比如判断文件是否已存在就跳过下载),直接修改任务代码即可,比依赖插件更灵活。
备注:内容来源于stack exchange,提问作者Hima_93
相关产品推荐
相关产品推荐

