Heim > Java > javaLernprogramm > Hauptteil

So implementieren Sie den JAR-Vorgang in Springboot und kopieren Ressourcendateien in das angegebene Verzeichnis

PHPz
Freigeben: 2023-05-12 21:34:04
nach vorne
1521 Leute haben es durchsucht

springboot implementiert den JAR-Vorgang, um Ressourcendateien in das angegebene Verzeichnis zu kopieren

1 Anforderungen

Während des Projektentwicklungsprozesses müssen alle Ressourcen im Verzeichnis resources/static/ in das angegebene Verzeichnis kopiert werden. Im Unternehmensprojekt müssen Videodateien heruntergeladen werden, da der Download über eine HTML-Seite verfügt, das Mehrkanalvideo geladen wird und die entsprechenden statischen Ressourcendateien wie js, css.jwplayer, jquery.js und andere Dateien verwendet werden

Maven Der Pfad des Glases und der normalerweise freigegebene Projekte sind unterschiedlich, daher wird beim Lesen des Pfades der Pfad des Glases abgerufen, der Dateipfad im Glas kann jedoch nicht abgerufen werden

Entsprechend Meine Bedürfnisse, die Idee des Kopierens besteht wahrscheinlich darin, sie zuerst abzurufen. Gehen Sie zur Dateiliste im Verzeichnis resources/static/blog und kopieren Sie dann die Dateien in einer Schleife durch die Liste an den angegebenen Speicherort (die relativen Pfade müssen verwendet werden). konsistent sein)

Da das Projekt in ein JAR-Paket gepackt wird, kann hier nicht die herkömmliche Methode zum Kopieren von Verzeichnisdateien verwendet werden:

Ressourcenschnittstelle, bei der es sich einfach um die abstrakte Zugriffsschnittstelle für Ressourcen handelt das gesamte Spring-Framework. Es erbt von der InputStreamSource-Schnittstelle. Nachfolgende Artikel werden es im Detail analysieren.

Methodenbeschreibung der Ressourcenschnittstelle:

Methode exists()isReadable()isOpen()getURL()getURI()getFile()contentLength()lastModified()createRelative()getFilename()getDescription()getInputStream()Rufen Sie die Ressourcenliste ab. Ich muss die Ressourcen über die ResourceLoader-Schnittstelle abrufen. Hier habe ich
Beschreibung
Bestimmen Sie, ob die Ressource vorhanden ist. True bedeutet, dass sie vorhanden ist.
Bestimmen Sie, ob der Inhalt der Ressource lesbar ist. Es ist zu beachten, dass der Inhalt möglicherweise nicht wirklich lesbar ist, wenn das Ergebnis wahr ist. Wenn es jedoch falsch zurückgibt, darf der Inhalt nicht lesbar sein.
Bestimmt, ob die zugrunde liegende Ressource, die durch die aktuelle Ressource dargestellt wird, geöffnet wurde. Wenn true zurückgegeben wird, kann sie nur einmal gelesen und dann geschlossen werden, um Ressourcenverluste zu vermeiden Es ist das einzige in der Implementierungsklasse. Das Rückgabeergebnis ist wahr und die anderen sind falsch.
Gibt die URL zurück, die der aktuellen Ressource entspricht. Eine Ausnahme wird ausgelöst, wenn die aktuelle Ressource nicht in eine URL aufgelöst werden kann. Beispielsweise kann ByteArrayResource nicht in eine URL geparst werden.
Gibt den URI zurück, der der aktuellen Ressource entspricht. Eine Ausnahme wird ausgelöst, wenn die aktuelle Ressource nicht in einen URI aufgelöst werden kann.
Gibt die Datei zurück, die der aktuellen Ressource entspricht.
Gibt die Länge des aktuellen Ressourceninhalts zurück.
Gibt die letzte Änderungszeit der zugrunde liegenden Ressource zurück, die durch die aktuelle Ressource dargestellt wird.
Erstellt eine neue Ressource basierend auf ihrem relativen Pfad. [Das Erstellen relativer Pfadressourcen wird standardmäßig nicht unterstützt]
Den Dateinamen der Ressource abrufen.
Gibt den Deskriptor der zugrunde liegenden Ressource der aktuellen Ressource zurück, bei dem es sich normalerweise um den vollständigen Pfad der Ressource handelt (tatsächlicher Dateiname oder tatsächliche URL-Adresse).
Ruft den Eingabestream ab, der durch die aktuelle Ressource dargestellt wird. Mit Ausnahme der InputStreamResource-Implementierungsklasse geben andere Resource-Implementierungsklassen jedes Mal einen brandneuen InputStream zurück, wenn sie die Methode getInputStream() aufrufen.

org.springframework.core.io.support.PathMatchingResourcePatternResolver

3 ausgewählt. Implementierungscode

/**
     * 只复制下载文件中用到的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);
    }
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren

5

Das obige ist der detaillierte Inhalt vonSo implementieren Sie den JAR-Vorgang in Springboot und kopieren Ressourcendateien in das angegebene Verzeichnis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:yisu.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!