springboot에서 jar 작업을 구현하고 리소스 파일을 지정된 디렉토리에 복사하는 방법
May 12, 2023 pm 09:34 PMspringboot는 리소스 파일을 지정된 디렉터리에 복사하는 jar 작업을 구현합니다
1. 요구 사항
프로젝트 개발 프로세스 중에 프로젝트 resources/static/ 디렉터리의 모든 리소스를 지정된 디렉터리에 복사해야 합니다. 회사 프로젝트에서는 비디오 파일을 다운로드해야 합니다. 다운로드에는 html 페이지가 있으므로 다중 채널 비디오가 로드되고 js, css.jwplayer, jquery.js 및 기타 파일과 같은 해당 정적 리소스 파일이 사용됩니다.
Maven jar의 경로와 일반적으로 출시되는 프로젝트가 다르기 때문에 경로를 읽어보면 jar의 경로를 알 수 있고, jar 안의 파일 경로를 알 수 없습니다.
2. 내 필요에 따라 복사하는 아이디어는 아마도 먼저 그것을 얻는 것입니다 resources/static/blog 디렉토리의 파일 목록으로 이동 한 다음 목록을 통해 루프의 지정된 위치에 파일을 복사합니다 (상대 경로가 필요함) 일관성을 유지하기 위해)
프로젝트가 jar 패키지로 패키징되므로 기존 디렉터리 파일 복사 방법을 사용할 수 없습니다. 여기서는 Spring 리소스를 사용해야 합니다.
Resource 인터페이스는 단순히 리소스에 대한 추상 액세스 인터페이스입니다. 전체 Spring 프레임워크의 이는 InputStreamSource 인터페이스에서 상속됩니다. 후속 기사에서는 이를 자세히 분석할 것입니다.리소스 인터페이스의 메서드 설명:
설명 | |
---|---|
리소스가 존재하는지 확인합니다. true는 리소스가 존재함을 의미합니다. | |
리소스의 내용을 읽을 수 있는지 확인합니다. 결과가 true이면 내용을 실제로 읽을 수 없지만 false를 반환하면 내용을 읽을 수 없어야 한다는 점에 유의해야 합니다. | |
현재 Resource가 나타내는 기본 리소스가 열렸는지 확인합니다. true가 반환되면 리소스 누출을 방지하기 위해 한 번만 읽은 다음 닫을 수 있습니다. 이는 구현 클래스에서 유일한 것입니다. 반환 결과는 true이고 나머지는 false입니다. | |
현재 리소스에 해당하는 URL을 반환합니다. 현재 리소스를 URL로 확인할 수 없으면 예외가 발생합니다. 예를 들어 ByteArrayResource는 URL로 구문 분석될 수 없습니다. | |
현재 리소스에 해당하는 URI를 반환합니다. 현재 리소스를 URI로 확인할 수 없으면 예외가 발생합니다. | |
현재 리소스에 해당하는 파일을 반환합니다. | |
현재 리소스 콘텐츠의 길이를 반환합니다. | |
현재 리소스가 나타내는 기본 리소스의 마지막 수정 시간을 반환합니다. | |
상대 경로를 기반으로 새 리소스를 만듭니다. [상대 경로 리소스 생성은 기본적으로 지원되지 않습니다.] | |
리소스의 파일 이름을 가져옵니다. | |
현재 리소스의 기본 리소스 설명자를 반환합니다. 이는 일반적으로 리소스의 전체 경로(실제 파일 이름 또는 실제 URL 주소)입니다. | |
현재 리소스가 나타내는 입력 스트림을 가져옵니다. InputStreamResource 구현 클래스를 제외하고 다른 Resource 구현 클래스는 getInputStream() 메소드를 호출할 때마다 완전히 새로운 InputStream을 반환합니다. |
org.springframework.core.io.support.PathMatchingResourcePatternResolver
3 구현 코드
/** * 只复制下载文件中用到的js */ private void copyJwplayer() { //判断指定目录下文件是否存在 ApplicationHome applicationHome = new ApplicationHome(getClass()); String rootpath = applicationHome.getSource().getParentFile().toString(); String realpath=rootpath+"/vod/jwplayer/"; //目标文件 String silderrealpath=rootpath+"/vod/jwplayer/silder/"; //目标文件 String historyrealpath=rootpath+"/vod/jwplayer/history/"; //目标文件 String jwplayerrealpath=rootpath+"/vod/jwplayer/jwplayer/"; //目标文件 String layoutrealpath=rootpath+"/vod/jwplayer/res/layout/"; //目标文件 /** * 此处只能复制目录中的文件,不能多层目录复制(目录中的目录不能复制,如果循环复制目录中的目录则会提示cannot be resolved to URL because it does not exist) */ //不使用getFileFromClassPath()则报[static/jwplayerF:/workspace/VRSH265/target/classes/static/jwplayer/flvjs/] cannot be resolved to URL because it does not exist //jwplayer File fileFromClassPath = FreeMarkerUtil.getFileFromClassPath("/static/jwplayer/"); //复制目录 FreeMarkerUtil.BatCopyFileFromJar(fileFromClassPath.toString(),realpath); //silder File flvjspath = FreeMarkerUtil.getFileFromClassPath("/static/jwplayer/silder/"); //复制目录 FreeMarkerUtil.BatCopyFileFromJar(flvjspath.toString(),silderrealpath); //history File historypath = FreeMarkerUtil.getFileFromClassPath("/static/jwplayer/history/"); //复制目录 FreeMarkerUtil.BatCopyFileFromJar(historypath.toString(),historyrealpath); //jwplayer File jwplayerpath = FreeMarkerUtil.getFileFromClassPath("/static/jwplayer/jwplayer/"); //复制目录 FreeMarkerUtil.BatCopyFileFromJar(jwplayerpath.toString(),jwplayerrealpath); //layout File layoutpath = FreeMarkerUtil.getFileFromClassPath("/static/jwplayer/res/layout/"); //复制目录 FreeMarkerUtil.BatCopyFileFromJar(layoutpath.toString(),layoutrealpath); }
4를 선택했습니다. FreeMarkerUtil
package com.aio.util; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.ResourcePatternResolver; import java.io.*; /** * @author:hahaha * @creattime:2021-12-02 10:33 */ public class FreeMarkerUtil { /** * 复制path目录下所有文件 * @param path 文件目录 不能以/开头 * @param newpath 新文件目录 */ public static void BatCopyFileFromJar(String path,String newpath) { if (!new File(newpath).exists()){ new File(newpath).mkdir(); } ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { //获取所有匹配的文件 Resource[] resources = resolver.getResources(path+"/*"); //打印有多少文件 for(int i=0;i<resources.length;i++) { Resource resource=resources[i]; try { //以jar运行时,resource.getFile().isFile() 无法获取文件类型,会报异常,抓取异常后直接生成新的文件即可;以非jar运行时,需要判断文件类型,避免如果是目录会复制错误,将目录写成文件。 if(resource.getFile().isFile()) { makeFile(newpath+"/"+resource.getFilename()); InputStream stream = resource.getInputStream(); write2File(stream, newpath+"/"+resource.getFilename()); } }catch (Exception e) { makeFile(newpath+"/"+resource.getFilename()); InputStream stream = resource.getInputStream(); write2File(stream, newpath+"/"+resource.getFilename()); } } } catch (Exception e) { e.printStackTrace(); } } /** * 创建文件 * @param path 全路径 指向文件 * @return */ public static boolean makeFile(String path) { File file = new File(path); if(file.exists()) { return false; } if (path.endsWith(File.separator)) { return false; } if(!file.getParentFile().exists()) { if(!file.getParentFile().mkdirs()) { return false; } } try { if (file.createNewFile()) { return true; } else { return false; } } catch (IOException e) { e.printStackTrace(); return false; } } /** * 输入流写入文件 * * @param is * 输入流 * @param filePath * 文件保存目录路径 * @throws IOException */ public static void write2File(InputStream is, String filePath) throws IOException { OutputStream os = new FileOutputStream(filePath); int len = 8192; byte[] buffer = new byte[len]; while ((len = is.read(buffer, 0, len)) != -1) { os.write(buffer, 0, len); } os.close(); is.close(); } /** *处理异常报错(springboot读取classpath里的文件,解决打jar包java.io.FileNotFoundException: class path resource cannot be opened) **/ public static File getFileFromClassPath(String path){ File targetFile = new File(path); if(!targetFile.exists()){ if(targetFile.getParent()!=null){ File parent=new File(targetFile.getParent()); if(!parent.exists()){ parent.mkdirs(); } } InputStream initialStream=null; OutputStream outStream =null; try { Resource resource=new ClassPathResource(path); //注意通过getInputStream,不能用getFile initialStream=resource.getInputStream(); byte[] buffer = new byte[initialStream.available()]; initialStream.read(buffer); outStream = new FileOutputStream(targetFile); outStream.write(buffer); } catch (IOException e) { } finally { if (initialStream != null) { try { initialStream.close(); // 关闭流 } catch (IOException e) { } } if (outStream != null) { try { outStream.close(); // 关闭流 } catch (IOException e) { } } } } return targetFile; } }
5.효과
위 내용은 springboot에서 jar 작업을 구현하고 리소스 파일을 지정된 디렉토리에 복사하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

인기 기사

인기 기사

뜨거운 기사 태그

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Springboot가 Jasypt를 통합하여 구성 파일 암호화를 구현하는 방법

SpringBoot가 Redisson을 통합하여 지연 대기열을 구현하는 방법

Redis를 사용하여 SpringBoot에서 분산 잠금을 구현하는 방법

springboot가 파일을 jar 패키지로 읽은 후 파일에 액세스할 수 없는 문제를 해결하는 방법

SpringBoot가 Redis를 사용자 정의하여 캐시 직렬화를 구현하는 방법

springboot에서 application.yml의 값을 얻는 방법
