


So implementieren Sie den JAR-Vorgang in Springboot und kopieren Ressourcendateien in das angegebene Verzeichnis
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:
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); }
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
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Voraussetzungen für die Ausführung von JAR-Dateien Die Ausführung von JAR-Dateien auf einem Linux-System erfordert die Installation der Java Runtime Environment (JRE), der Grundkomponente, die zum Ausführen von Java-Anwendungen erforderlich ist, einschließlich der Java Virtual Machine (JVM), Kernklassenbibliotheken usw. Viele gängige Linux-Distributionen wie Ubuntu, Debian, Fedora, openSUSE usw. bieten Softwarebibliotheken mit JRE-Paketen, um die Benutzerinstallation zu erleichtern. Im folgenden Artikel werden die Schritte zur Installation von JRE auf gängigen Distributionen detailliert beschrieben. Nach dem Einrichten der JRE können Sie je nach Ihren persönlichen Vorlieben das Befehlszeilenterminal oder die grafische Benutzeroberfläche zum Starten der JAR-Datei verwenden. Ihre Wahl hängt möglicherweise von Ihrer Vertrautheit mit Linux-Shells und Ihren persönlichen Vorlieben ab

Einführung in Jasypt Jasypt ist eine Java-Bibliothek, die es einem Entwickler ermöglicht, seinem Projekt mit minimalem Aufwand grundlegende Verschlüsselungsfunktionen hinzuzufügen und kein tiefes Verständnis der Funktionsweise der Verschlüsselung erfordert. standardbasierte Verschlüsselungstechnologie. Passwörter, Text, Zahlen, Binärdateien verschlüsseln ... Geeignet für die Integration in Spring-basierte Anwendungen, offene API, zur Verwendung mit jedem JCE-Anbieter ... Fügen Sie die folgende Abhängigkeit hinzu: com.github.ulisesbocchiojasypt-spring-boot-starter2 Die Vorteile von Jasypt schützen unsere Systemsicherheit. Selbst wenn der Code durchgesickert ist, kann die Datenquelle garantiert werden.

Nutzungsszenario 1. Die Bestellung wurde erfolgreich aufgegeben, die Zahlung erfolgte jedoch nicht innerhalb von 30 Minuten. Die Zahlung ist abgelaufen und die Bestellung wurde automatisch storniert. 2. Die Bestellung wurde unterzeichnet und es wurde 7 Tage lang keine Bewertung durchgeführt. Wenn die Bestellung abläuft und nicht ausgewertet wird, wird die Bestellung standardmäßig positiv bewertet. Wenn der Händler die Bestellung innerhalb von 5 Minuten nicht erhält, wird die Bestellung abgebrochen Es wird eine SMS-Erinnerung gesendet ... Für Szenarien mit langen Verzögerungen und geringer Echtzeitleistung können wir die Aufgabenplanung verwenden, um eine regelmäßige Abfrageverarbeitung durchzuführen. Zum Beispiel: xxl-job Heute werden wir auswählen

1. Redis implementiert das Prinzip der verteilten Sperren und warum verteilte Sperren erforderlich sind. Bevor über verteilte Sperren gesprochen wird, muss erläutert werden, warum verteilte Sperren erforderlich sind. Das Gegenteil von verteilten Sperren sind eigenständige Sperren. Wenn wir Multithread-Programme schreiben, vermeiden wir Datenprobleme, die durch den gleichzeitigen Betrieb einer gemeinsam genutzten Variablen verursacht werden. Normalerweise verwenden wir eine Sperre, um die Richtigkeit der gemeinsam genutzten Variablen sicherzustellen Die gemeinsam genutzten Variablen liegen im gleichen Prozess. Wenn es mehrere Prozesse gibt, die gleichzeitig eine gemeinsam genutzte Ressource betreiben müssen, wie können sie sich dann gegenseitig ausschließen? Heutige Geschäftsanwendungen sind in der Regel Microservice-Architekturen, was auch bedeutet, dass eine Anwendung mehrere Prozesse bereitstellen muss. Wenn mehrere Prozesse dieselbe Datensatzzeile in MySQL ändern müssen, ist eine Verteilung erforderlich, um fehlerhafte Daten zu vermeiden wird zu diesem Zeitpunkt eingeführt. Der Stil ist gesperrt. Punkte erreichen wollen

Springboot liest die Datei, kann aber nach dem Packen in ein JAR-Paket nicht auf die neueste Entwicklung zugreifen. Es gibt eine Situation, in der Springboot die Datei nach dem Packen in ein JAR-Paket nicht lesen kann ist ungültig und kann nur über den Stream gelesen werden. Die Datei befindet sich unter resources publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

SpringBoot und SpringMVC sind beide häufig verwendete Frameworks in der Java-Entwicklung, es gibt jedoch einige offensichtliche Unterschiede zwischen ihnen. In diesem Artikel werden die Funktionen und Verwendungsmöglichkeiten dieser beiden Frameworks untersucht und ihre Unterschiede verglichen. Lassen Sie uns zunächst etwas über SpringBoot lernen. SpringBoot wurde vom Pivotal-Team entwickelt, um die Erstellung und Bereitstellung von Anwendungen auf Basis des Spring-Frameworks zu vereinfachen. Es bietet eine schnelle und einfache Möglichkeit, eigenständige, ausführbare Dateien zu erstellen

Wenn Springboot + Mybatis-plus keine SQL-Anweisungen zum Hinzufügen mehrerer Tabellen verwendet, werden die Probleme, auf die ich gestoßen bin, durch die Simulation des Denkens in der Testumgebung zerlegt: Erstellen Sie ein BrandDTO-Objekt mit Parametern, um die Übergabe von Parametern an den Hintergrund zu simulieren dass es äußerst schwierig ist, Multi-Table-Operationen in Mybatis-plus durchzuführen. Wenn Sie keine Tools wie Mybatis-plus-join verwenden, können Sie nur die entsprechende Mapper.xml-Datei konfigurieren und die stinkende und lange ResultMap konfigurieren Schreiben Sie die entsprechende SQL-Anweisung. Obwohl diese Methode umständlich erscheint, ist sie äußerst flexibel und ermöglicht es uns

1. Passen Sie den RedisTemplate1.1-Standard-Serialisierungsmechanismus an. Die API-basierte Redis-Cache-Implementierung verwendet die RedisTemplate-Vorlage für Daten-Caching-Vorgänge. Öffnen Sie hier die RedisTemplate-Klasse und zeigen Sie die Quellcodeinformationen der Klasse publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations an. Schlüssel deklarieren, verschiedene Serialisierungsmethoden des Werts, der Anfangswert ist leer @NullableprivateRedisSe
