Gradle構建jar包,將文件打包到lib目錄外方便讀取和下載
1.項目使用了最近很火的gradle作爲構建工具
框架是spring boot,項目在服務器上運行時當然是jar包了。如果你有心將jar包打開,會發現包內結構是這樣的
2.在gradle構建的項目裏,你的項目是作爲一個jar包被放置在lib目錄裏的
如下圖
當我相從項目裏下載固定的文件,比如說導入的模版等文件時,我們通過路徑直接讀取jar包內的文件顯然是不可取且消耗資源的。而我們將這個文件放在lib目錄的父目錄裏,這個操作就簡單的多了。
3.如何修改呢?我們先找到項目裏的gradle腳本文件
就是它了
4.在其中添加一個任務,如下
task copyFiletemplet(type: Copy) {
from('src/main/resources/filetemplet') {
include '*'
}
into 'build/filetemplet'
dependsOn createFiletemplet
}
文件如圖所示
5.創建一個配置項或者修改gradle裏已有的配置項
distributions {
main {
baseName = "app"
version = ""
contents {
from(copyFiletemplet) {
into "filetemplet"
}
}
}
}
其中baseName是你的項目部署根目錄真實路徑。 copyFiletemplet是我第四步定義的任務名稱,filetemplet是我指定的文件放置位置。
然後可以通過訪問 baseName + filetemplet 所表示的目錄輕鬆的獲取到要下載的文件了。
舉個栗子:我項目裏baseName爲 /app ,文件放置位置爲 baseName下的 filetemplet目錄 ,我 只需訪問 /app/filetemplet/ 目錄就能獲取到我所需的文件了
上代碼吧
/**
* 下載文件模版
*
* @param response Http響應
* @param fileName 瀏覽器顯示文件名
* @param fileRealName 項目內文件名稱
*/
@SneakyThrows
public static void downloadFiletemplet(HttpServletResponse response, String fileName, String fileRealName) {
response.setCharacterEncoding("UTF-8");
response.setContentType("multipart/form-data;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes("UTF-8"), "ISO8859-1")); // 中文文件名處理
response.addHeader("Content-Type", "application/vnd.ms-excel");
String getName;
//如果不是linux系統就是本地下載
if ((!System.getProperties().getProperty("os.name").toLowerCase().contains("linux"))) {
getName = System.getProperty("user.dir").concat("/build/resources/main/filetemplet/").concat(fileRealName);
} else {
getName = "/app/filetemplet/".concat(fileRealName);
}
log.info("下載文件 {}",getName);
@Cleanup InputStream inputStream = new FileInputStream(new File(getName));
OutputStream os = response.getOutputStream();
IOUtils.copy(inputStream, os);
}