2016-08-28 3 views
2

Ich bin neu bei Spring Boot und habe Schwierigkeiten, eine einfache HTML-Webanwendung (AngularJS) für Tomcat 8 bereitzustellen. Diese Webanwendung dient lediglich als HTML/CSS/JS Inhalt ohne REST-Aufrufe an ein Back-End. Es wurde mit Webpack "kompiliert" - das erzeugt JS/CSS-Bundles und eine einzige index.html-Datei, die über <script>/<link> Tags auf sie verweist - und wurde auf ExpressJS und Spring Boot mit Embedded Tomcat getestet und funktioniert wie erwartet. Aber den Weg eines eigenständigen WAR zu gehen und auf Tomcat 8 zu verteilen, scheint nicht richtig zu funktionieren.Bereitstellen von Spring Boot WAR auf Tomcat 8 - HTTP 404 beim Zugriff auf Ressourcen

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.example.my-app</groupId> 
    <artifactId>my-app</artifactId> 
    <version>0.0.1</version> 
    <packaging>war</packaging> 

    <name>my-app</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.0.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
      <scope>provided</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

:

für Frühjahr Boot-Projekt habe ich alle HTML/CSS/JS-Dateien im Ordner src/main/resources/public (keine Unterordner) und haben auch die pom.xml wie folgt (Grund config) konfiguriert enthalten "Main" Klasse:

package com.example.my.app; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.builder.SpringApplicationBuilder; 
import org.springframework.boot.context.web.SpringBootServletInitializer; 

@SpringBootApplication 
public class MyAppApplication extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(MyAppApplication.class); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(MyAppApplication.class, args); 
    } 
} 

Hier sind die Schritte, die ich verwendet, um die Tomcat-Bereitstellung zu tun:

  1. mvn clean package, um den Krieg
  2. Kopieren Sie die WAR-Pfad zu erzeugen/zu/tomcat8/Webapp
  3. starten
  4. Tomcat
  5. http://localhost:8080/my-app => Auto-Lasten index.html

Leider 404 Fehler sind alles, was ich sehen weil es keine JS/CSS-Datei finden konnte. Gibt es eine Konfiguration, die ich vermisse?

Aktualisiert: Hier ist die Datei index.html (automatisch generiert über Webpack):

<!doctype html> 
<html> 
    <head> 
    <base href="/"> 
    <meta charset="utf-8"> 
    <title>My App</title> 
    <meta name="description" content=""> 
    <meta name="viewport" content="width=device-width"> 
    <link rel="icon" type="image/png" href="./assets/images/favicon.ico" /> 
    <link href="/main-aa49893f83cc830596563d81f09a9611.css" rel="stylesheet"><link href="/main-5949f1f257a55a77e48bc4ab62fbc99a.css" rel="stylesheet"></head> 

    <body ng-app="myapp"> 
    <ui-view></ui-view> 
    <script type="text/javascript" src="vendor-353ddb48f4ffe6546d59.js"></script><script type="text/javascript" src="app-353ddb48f4ffe6546d59.js"></script></body> 
</html> 

Hier sind die Fehler, die ich in Chrome Web Inspector bin zu sehen beim Besuch localhost:8080/my-app/index.html:

http://localhost:8080/main-5949f1f257a55a77e48bc4ab62fbc99a.css Failed to load resource: the server responded with a status of 404 (Not Found) 
http://localhost:8080/main-aa49893f83cc830596563d81f09a9611.css Failed to load resource: the server responded with a status of 404 (Not Found) 
http://localhost:8080/vendor-4ba9083ed9802279c207.js Failed to load resource: the server responded with a status of 404 (Not Found) 
http://localhost:8080/app-4ba9083ed9802279c207.js Failed to load resource: the server responded with a status of 404 (Not Found) 
http://localhost:8080/vendor-4ba9083ed9802279c207.js Failed to load resource: the server responded with a status of 404 (Not Found) 
http://localhost:8080/app-4ba9083ed9802279c207.js Failed to load resource: the server responded with a status of 404 (Not Found) 
http://localhost:8080/main-aa49893f83cc830596563d81f09a9611.css Failed to load resource: the server responded with a status of 404 (Not Found) 
http://localhost:8080/main-5949f1f257a55a77e48bc4ab62fbc99a.css Failed to load resource: the server responded with a status of 404 (Not Found) 

Eine Sache, die ich vergessen zu erwähnen. Wenn ich den Krieg mit mvn clean package erzeuge, werden alle Dateien, die sich unter src/main/resources/public befinden, in den Unterordner WEB-INF/classes/resource gestellt. Laut den Recherchen sind diese Dateien nicht öffentlich sichtbar (d. H., Wenn ich versuche, auf localhost zuzugreifen: 8080/my-app/foo.css, wird 404 angezeigt). Kann die Datei index.html die JS/CSS-Dateien, von denen sie abhängt, nicht "sehen"?

+0

Geben Sie mehr Kontext darüber, was der vollständige 404-Fehler ist, oder schließen Sie Ihre index.html-Seite ein, damit die Benutzer nachvollziehen können, wie die Ressourcendateien geladen werden. –

Antwort

-1

Uhmm ich habe einige davon auf meinem spring-boot Projekt probiert.

Zuerst würde ich eine Abhängigkeit von meinem Projekt hinzufügen pom.xml

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-thymeleaf</artifactId> 
</dependency> 

dann würde ich ein index.html hinzufügen auf src/main/resources/templates

nach, dass Sie einen Controller zu diesem Index zu Punkt hinzufügen sollen

@Controller 
public class AppController { 

    @RequestMapping("/") 
    String index() { 
     return "index"; 
    } 
} 

Weitere Informationen finden Sie in diesem Handbuch.Spring-boot and Thymeleaf

+0

Das hilft der ursprünglichen Frage nicht. Sie zeigen nur, wie Sie die Vorlagen-Engine verwenden. Der ursprüngliche Post sagt, dass sie kein Problem haben, dies mit einem eingebetteten Servlet-Server zu tun, nur wenn sie auf einen externen Server gestellt werden. –

1

Das häufigste Problem mit dem Setup, das Sie beschrieben haben, ohne weiteren Kontext ist, dass Sie höchstwahrscheinlich absolute URLs verwenden, um auf Ihre js/css-Dateien zu zeigen. Als solche, wenn Sie sie in den Servlet-Container unter /my-app setzen, verweisen sie nicht mehr ordnungsgemäß, da sie versuchen, zum Stamm / zu gehen. Sie müssen relative URLs verwenden, wenn Sie den Speicherort der Ressourcendateien auf dem Pfad beschreiben.

+0

Hallo, Shawn. Ich habe die Antwort aktualisiert. Die Datei index.html enthält relative URLs, die auf die Ressourcen verweisen. Alle HTML/CSS/JS befinden sich im Ordner src/main/resources/public und auf derselben Ebene wie die Datei index.html. –

0

Ich fand es herauszufinden, aber nicht Spring Boot, um die WAR-Datei zu packen. Es gab ein anderes Projekt, das auf meinem lokalen herumlag, das einfache alte Maven + pom.xml + web.xml verwendete, um WARs zu erstellen, die ich als eine Referenz verwendete, um herauszufinden, warum das aktuelle Projekt nicht funktionierte. Es gab mehrere Probleme:

  • Wenn Sie auf Tomcat 8 mithilfe der Standardkonfiguration bereitstellen, wird der Name der WAR-Datei (was sie als Kontext bezeichnen) an den Pfad angehängt. In diesem Fall war es http://localhost:8080/my-app. Die "kompilierte" AngularJS-App index.html hatte einen <base href="/">-Tag, der auf /my-app/ anstelle von / zeigen musste. Dies war der Hauptgrund, warum die JS/CSS-Dateien in Web Inspector > Sources nicht sichtbar waren.
  • <link>src des Tag-Attribut wurde keine führendes /
  • Im Fall des Frühlings-Boot-App die ich oben geschrieben enthalten soll, kommt es mit einem Embedded Tomcat und setzt die App auf dem Root-Kontext so gibt es keine Notwendigkeit zu ändern Alle Pfade in der Datei index.html.
  • Ähnlich wie Spring Boot hatte ich auch keine Probleme mit der Anwendung in ExpressJS, da ein "Sub-Kontext" wurde nicht erstellt. Auch in diesem Fall mussten keine Dateien geändert werden.
  • Es gab andere Fehler im Zusammenhang mit der Suche nach Ressourcen wie .ttf Dateien, aber zumindest die App konnte ausgeführt werden.

    Update: Sieht aus wie sein möglichen die WAR-Datei aus dem Stamm Tomcat 8 zu dienen, indem Sie die folgenden in der Nähe der Unterseite der server.xml Datei hinzufügen:

    <Context path="" docBase="my-app" debug="0" reloadable="true"></Context> 
    

    dies die Notwendigkeit verhindern wird, den Index zu ändern. HTML-Datei.

    Super :)

    0

    hatte ich das gleiche Problem, und es bezieht sich auf Webpack mehr als Spring-Stiefel. In Ihrem webpack.common.js/webpack.prod.js Sie haben zu setzen:

    metada.baseUrl = './'; 
    

    und diese in index.html in Ihrem <base> Link zu injizieren

    Und Sie müssen auch festlegen

    output.publicPath: './' 
    

    Mit beiden Variablen eingestellt, das hat für mich funktioniert.

    Verwandte Themen