ホームページ  >  記事  >  Java  >  Springbootでjar操作を実装し、リソースファイルを指定したディレクトリにコピーする方法

Springbootでjar操作を実装し、リソースファイルを指定したディレクトリにコピーする方法

PHPz
PHPz転載
2023-05-12 21:34:041602ブラウズ

springboot は jar 操作を実装し、リソース ファイルを指定されたディレクトリにコピーします

1. 要件

プロジェクト開発プロセス中に、プロジェクトの resource/static/ ディレクトリ内のすべてのリソースをコピーする必要があります指定されたディレクトリにコピーされます。会社のプロジェクトでは、ビデオ ファイルをダウンロードする必要があります。ダウンロードには HTML ページがあるため、対応する静的リソース ファイル (js、css.jwplayer、jquery.js およびその他のファイルなど) を使用してマルチチャンネル ビデオをロードします

Maven が生成する jar のパスが通常公開されているプロジェクトのパスと異なるため、パスを読み込むと jar のパスが取得され、jar 内のファイルパスが取得できません

2. アイデア

私のニーズに基づいて、コピーのアイデアは、最初に resource/static/blog ディレクトリ内のファイル リストを取得し、次にそのファイルを指定された場所にコピーすることです。リストをループします (相対パスが一貫している必要があります)

プロジェクトは jar パッケージに分類されるため、従来のディレクトリ ファイルのコピー方法は使用できません。ここでは Spring リソースが必要です。

リソース インターフェイス。これは、Spring フレームワーク全体のリソースに対する抽象的なアクセス インターフェイスです。これは、InputStreamSource インターフェイスから継承します。以降の記事で詳しく分析します。

リソース インターフェイスのメソッドの説明:

##exists() リソースが存在するかどうかを判断します。true は存在することを意味します。 isReadable()リソースのコンテンツが読み取り可能かどうかを判断します。結果が true の場合、その内容は実際には読み取り可能ではない可能性がありますが、false を返した場合、その内容は読み取り可能ではないことに注意してください。 isOpen() 現在のリソースによって表される基になるリソースが開かれているかどうかを確認します。true が返された場合、一度だけ読み取ってから閉じることができます。リソース漏洩を避ける; このメソッドは主にInputStreamResourceを対象としていますが、実装クラスでは戻り値のみがtrueとなり、その他はfalseとなります。 getURL()現在のリソースに対応する URL を返します。現在のリソースを URL に解決できない場合は、例外がスローされます。たとえば、ByteArrayResource を URL に解析することはできません。 getURI()現在のリソースに対応する URI を返します。現在のリソースを URI に解決できない場合は、例外がスローされます。 getFile()現在のリソースに対応するファイルを返します。 contentLength()現在のリソース コンテンツの長さを返しますlastModified() Resource で表される基礎となるリソースの現在の最終変更時刻を返します。 createRelative()リソースの相対パスに基づいて新しいリソースを作成します。 [相対パス リソースの作成はデフォルトではサポートされていません]getFilename()リソースのファイル名を取得します。 getDescription()現在のリソースの基礎となるリソースの記述子を返します。これは通常、リソースの完全なパス (実際のファイル名または実際の URL アドレス) )。 getInputStream()現在のリソースによって表される入力ストリームを取得します。 InputStreamResource 実装クラスを除き、他の Resource 実装クラスは getInputStream() メソッドを呼び出すたびに新しい InputStream を返します。
メソッド Description
リソース リストを取得します。ResourceLoader インターフェイスを通じてリソースを取得する必要があります。ここでは

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操作を実装し、リソースファイルを指定したディレクトリにコピーする方法

以上がSpringbootでjar操作を実装し、リソースファイルを指定したディレクトリにコピーする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。