[JAVA] Das Verhalten der Klasse # getClassLoader ändert sich abhängig davon, ob sie in der IDE oder in der JAR ausgeführt wird.

Überblick

Wenn ich es mit einem Glas ausführe, kann ich die Ressource nicht finden, wenn sich zwei Schrägstriche wie der folgende überlappen.

            InputStream resource1 = this.getClass().getClassLoader().getResourceAsStream("test//hello.txt");

Projektstruktur

スクリーンショット 2018-03-22 9.18.52.png

Beispielcode

package work.inabajun;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Main {

    public static void main(String[] args) throws IOException {
        new Test().getHelloText();
    }

    private static class Test {

        public void getHelloText() throws IOException {
            //Ein Schrägstrich
            InputStream resource1 = this.getClass().getClassLoader().getResourceAsStream("test/hello.txt");
            if( resource1 != null) {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource1));
                System.out.println("Resource1:" + bufferedReader.readLine());
            } else {
                System.out.println("Resource1 is null.");
            }

            //Zwei Schrägstriche
            InputStream resource2 = this.getClass().getClassLoader().getResourceAsStream("test//hello.txt");
            if( resource2 != null) {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource2));
                System.out.println("Resource2:" + bufferedReader.readLine());
            } else {
                System.out.println("Resource2 is null.");
            }
        }
    }
}

Anlaufen

Mit Intellij IDEA gestartet

$ java "-javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=60858:/Applications/IntelliJ IDEA CE.app/Contents/bin" -Dfile.encoding=UTF-8  -classpath /Users/inabajunmr/test/untitled/out/production/untitled work.inabajun.Main
objc[7462]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/bin/java (0x1023c94c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x103bf04e0). One of the two will be used. Which one is undefined.
Resource1:abcde12345
Resource2:abcde12345

Sowohl Resource1 als auch Resource2 können erworben werden.

Erstellen und starten Sie eine ausführbare JAR-Datei

$ java -jar untitled_jar/untitled.jar 
Resource1:abcde12345
Resource2 is null.

Resource2 wird null.

Mir wurde gesagt, dass die Vorlage in Spring Boot + Thymeleaf nicht gefunden werden konnte

Ich habe den folgenden Code mit Spring Boot + Thymeleaf geschrieben und er funktionierte normal beim Booten mit Gradle oder IDE

	@GetMapping("/list.html")
	public String viewInput(final Model model) {
		return "/resource/list";
	}

Als ich es in der Umgebung bereitstellte, war ich wütend, dass es keine Vorlage gab.

2018-03-21 11:58:56.840 ERROR 26381 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/resource/list", template might not exist or might not be accessible by any of the configured Template Resolvers] with root cause

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "/resource/list", template might not exist or might not be accessible by any of the configured Template Resolvers
    at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:870)
    at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1072)
    at org.thymeleaf.spring5.view.ThymeleafView.renderFragment(ThymeleafView.java:354)

Der Unterschied in diesem Verhalten. https://github.com/spring-projects/spring-boot/issues/1744

Code, der richtig funktioniert hat

Nach dem Entfernen des führenden Schrägstrichs funktionierte es mit beiden Startmethoden.

	@GetMapping("/list.html")
	public String viewInput(final Model model) {
		return "resource/list";
	}

Recommended Posts

Das Verhalten der Klasse # getClassLoader ändert sich abhängig davon, ob sie in der IDE oder in der JAR ausgeführt wird.
Verhalten, wenn jedes im umgekehrten Bereich ausgeführt wird
Was ist @Override oder @SuppressWarnings ("SleepWhileInLoop") vor der Funktion? ?? ??
Ändern Sie das Gespräch je nachdem, welcher Tag heute ist
Unterschiedliche Puffer- und Löschregeln, je nachdem, ob die Standardausgabe eine Konsole oder ein anderer Befehl ist
Fehler, wenn das in SpringWebFlux verwendete Mitglied der Entity-Klasse endgültig ist
[Java] Wo befindet sich die Implementierungsklasse der Annotation, die in BeanValidation vorhanden ist?
[Java] Ist es nicht erforderlich, "Identität" bei der Implementierung der equals () -Methode zu überprüfen?
Rufen Sie den ersten Wochentag im aktuellen Gebietsschema ab (welcher Tag ist heute?)
Ist es Mainstream, das schließende Tag des <P> -Tags nicht in Javadoc zu schreiben?