Maison  >  Article  >  Java  >  Comment Springboot implémente-t-il le fonctionnement de jar et copie-t-il les fichiers de ressources dans le répertoire spécifié ?

Comment Springboot implémente-t-il le fonctionnement de jar et copie-t-il les fichiers de ressources dans le répertoire spécifié ?

PHPz
PHPzavant
2023-05-12 21:34:041617parcourir

springboot implémente l'opération jar pour copier les fichiers de ressources dans le répertoire spécifié

1 Exigences

Pendant le processus de développement du projet, toutes les ressources du répertoire resources/static/ du projet doivent être copiées dans le répertoire spécifié. Dans le projet d'entreprise, les fichiers vidéo doivent être téléchargés. Étant donné que le téléchargement comporte une page HTML, la vidéo multicanal est chargée et les fichiers de ressources statiques correspondants sont utilisés, tels que js, css.jwplayer, jquery.js et d'autres fichiers.

Maven Les chemins du pot et les projets habituellement publiés sont différents, donc lors de la lecture du chemin, le chemin du pot est obtenu et le chemin du fichier dans le pot ne peut pas être obtenu

Idée

Selon. mes besoins, l'idée de la copie est probablement de l'obtenir en premier. Accédez à la liste des fichiers dans le répertoire resources/static/blog, puis copiez les fichiers à l'emplacement spécifié en boucle dans la liste (les chemins relatifs doivent soyez cohérent)

Étant donné que le projet sera emballé dans un package jar, la méthode traditionnelle de copie de fichiers de répertoire ne peut pas être utilisée ici :

L'interface de ressources, qui est simplement l'interface d'accès abstraite aux ressources de. l'ensemble du framework Spring. Il hérite de l'interface InputStreamSource. Les articles suivants l’analyseront en détail.

Description de la méthode de l'interface de ressource :

Méthode Description
exists() Déterminez si la ressource existe, vrai signifie qu'elle existe.
isReadable() Déterminez si le contenu de la ressource est lisible. Il est à noter que lorsque le résultat est vrai, son contenu peut ne pas être vraiment lisible, mais s'il renvoie faux, son contenu ne doit pas être lisible.
isOpen() Détermine si la ressource sous-jacente représentée par la ressource actuelle a été ouverte. Si true est renvoyé, elle ne peut être lue qu'une seule fois puis fermée pour éviter une fuite de ressources. Cette méthode est principalement destinée à InputStreamResource ; c'est le seul de la classe d'implémentation. Le résultat renvoyé est vrai et les autres sont faux.
getURL() Renvoie l'URL correspondant à la ressource actuelle. Une exception sera levée si la ressource actuelle ne peut pas être résolue en URL. Par exemple, ByteArrayResource ne peut pas être analysé dans une URL.
getURI() Renvoie l'URI correspondant à la ressource actuelle. Une exception sera levée si la ressource actuelle ne peut pas être résolue en un URI.
getFile() Renvoie le fichier correspondant à la ressource actuelle.
contentLength() Renvoie la longueur du contenu de la ressource actuelle
lastModified() Renvoie l'heure de la dernière modification de la ressource sous-jacente représentée par la ressource actuelle.
createRelative() Créez une nouvelle ressource basée sur son chemin relatif. [La création de ressources de chemin relatif n'est pas prise en charge par défaut]
getFilename() Obtenir le nom de fichier de la ressource.
getDescription() Renvoie le descripteur de la ressource sous-jacente de la ressource actuelle, qui est généralement le chemin complet de la ressource (nom de fichier réel ou adresse URL réelle).
getInputStream() Obtenir le flux d'entrée représenté par la ressource actuelle. À l'exception de la classe d'implémentation InputStreamResource, les autres classes d'implémentation Resource renverront un tout nouveau InputStream chaque fois qu'elles appelleront la méthode getInputStream().

Obtenez la liste des ressources, j'ai besoin d'obtenir les ressources via l'interface ResourceLoader, ici j'ai choisi

org.springframework.core.io.support.PathMatchingResourcePatternResolver

3 Code d'implémentation

/**
     * 只复制下载文件中用到的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. Effet

Comment Springboot implémente-t-il le fonctionnement de jar et copie-t-il les fichiers de ressources dans le répertoire spécifié ?

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer