목차
springboot는 리소스 파일을 지정된 디렉터리에 복사하는 jar 작업을 구현합니다
1. 요구 사항
2. 내 필요에 따라 복사하는 아이디어는 아마도 먼저 그것을 얻는 것입니다 resources/static/blog 디렉토리의 파일 목록으로 이동 한 다음 목록을 통해 루프의 지정된 위치에 파일을 복사합니다 (상대 경로가 필요함) 일관성을 유지하기 위해)
4를 선택했습니다. FreeMarkerUtil
5.효과
Java java지도 시간 springboot에서 jar 작업을 구현하고 리소스 파일을 지정된 디렉토리에 복사하는 방법

springboot에서 jar 작업을 구현하고 리소스 파일을 지정된 디렉토리에 복사하는 방법

May 12, 2023 pm 09:34 PM
jar springboot resources

springboot는 리소스 파일을 지정된 디렉터리에 복사하는 jar 작업을 구현합니다

1. 요구 사항

프로젝트 개발 프로세스 중에 프로젝트 resources/static/ 디렉터리의 모든 리소스를 지정된 디렉터리에 복사해야 합니다. 회사 프로젝트에서는 비디오 파일을 다운로드해야 합니다. 다운로드에는 html 페이지가 있으므로 다중 채널 비디오가 로드되고 js, css.jwplayer, jquery.js 및 기타 파일과 같은 해당 정적 리소스 파일이 사용됩니다.

Maven jar의 경로와 일반적으로 출시되는 프로젝트가 다르기 때문에 경로를 읽어보면 jar의 경로를 알 수 있고, jar 안의 파일 경로를 알 수 없습니다.

2. 내 필요에 따라 복사하는 아이디어는 아마도 먼저 그것을 얻는 것입니다 resources/static/blog 디렉토리의 파일 목록으로 이동 한 다음 목록을 통해 루프의 지정된 위치에 파일을 복사합니다 (상대 경로가 필요함) 일관성을 유지하기 위해)

프로젝트가 jar 패키지로 패키징되므로 기존 디렉터리 파일 복사 방법을 사용할 수 없습니다. 여기서는 Spring 리소스를 사용해야 합니다.

Resource 인터페이스는 단순히 리소스에 대한 추상 액세스 인터페이스입니다. 전체 Spring 프레임워크의 이는 InputStreamSource 인터페이스에서 상속됩니다. 후속 기사에서는 이를 자세히 분석할 것입니다.

리소스 인터페이스의 메서드 설명:

메서드 exists()isReadable()isOpen()getURL()getURI()getFile()contentLength()lastModified()createRelative()getFilename()getDescription()getInputStream()리소스 목록을 가져오려면 ResourceLoader 인터페이스를 통해 리소스를 가져와야 합니다. 여기서는
설명
리소스가 존재하는지 확인합니다. 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

Springboot가 Jasypt를 통합하여 구성 파일 암호화를 구현하는 방법 Springboot가 Jasypt를 통합하여 구성 파일 암호화를 구현하는 방법 Jun 01, 2023 am 08:55 AM

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

Linux에서 jar 파일을 실행하는 방법 Linux에서 jar 파일을 실행하는 방법 Feb 20, 2024 am 10:40 AM

Linux에서 jar 파일을 실행하는 방법

SpringBoot가 Redisson을 통합하여 지연 대기열을 구현하는 방법 SpringBoot가 Redisson을 통합하여 지연 대기열을 구현하는 방법 May 30, 2023 pm 02:40 PM

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

Redis를 사용하여 SpringBoot에서 분산 잠금을 구현하는 방법 Redis를 사용하여 SpringBoot에서 분산 잠금을 구현하는 방법 Jun 03, 2023 am 08:16 AM

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

springboot가 파일을 jar 패키지로 읽은 후 파일에 액세스할 수 없는 문제를 해결하는 방법 springboot가 파일을 jar 패키지로 읽은 후 파일에 액세스할 수 없는 문제를 해결하는 방법 Jun 03, 2023 pm 04:38 PM

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

SpringBoot와 SpringMVC의 비교 및 ​​차이점 분석 SpringBoot와 SpringMVC의 비교 및 ​​차이점 분석 Dec 29, 2023 am 11:02 AM

SpringBoot와 SpringMVC의 비교 및 ​​차이점 분석

SpringBoot가 Redis를 사용자 정의하여 캐시 직렬화를 구현하는 방법 SpringBoot가 Redis를 사용자 정의하여 캐시 직렬화를 구현하는 방법 Jun 03, 2023 am 11:32 AM

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

springboot에서 application.yml의 값을 얻는 방법 springboot에서 application.yml의 값을 얻는 방법 Jun 03, 2023 pm 06:43 PM

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

See all articles