При упаковке SPA (и без кода Java) в WAR, как обслуживать index.html для каждого URL, кроме тех, которые соответствуют фактическим файлам активов? - PullRequest
1 голос
/ 07 мая 2019

У меня есть одностраничное веб-приложение, которое при сборке должно быть установлено на сервере приложений java-ee, например Glassfish. То есть я должен упаковать его в WAR.

Это одностраничное веб-приложение сильно отделено от его внутреннего приложения, оно должно быть само по себе сборочным и развертываемым. Таким образом, WAR должен включать и включать одностраничное веб-приложение.

Если возможно, я бы хотел решить эту проблему без использования кода Java.

В случае одностраничного приложения маршрутизация URL должна работать следующим образом:

  1. Если запрошенный URL-адрес соответствует файлу статического ресурса (html, js, css и т. Д.), Этот файл должен быть обработан.

  2. В любом другом случае index.html должен быть обслужен.

Если вторая точка не применяется, к приложению (по умолчанию) можно получить доступ только в точке входа (index.html). И не с URL-адресами, указывающими непосредственно на какие-либо подчиненные.

Существует обходной путь, поскольку в Ember.js можно установить опцию для использования URL-адресов субшоу на основе хеша. Но это имеет свои ограничивающие недостатки, и я бы хотел полностью их избежать.

Однако решение, которое у меня есть в настоящее время, работает только путем включения указанного обходного пути. Я использую Maven и maven-assembly-plugin для достижения этой цели.

pom.xml

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>My App</name>
  <build>
    <finalName>finalName</finalName>
    <plugins>
      <plugin>
        <!-- assemble static content -->
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <descriptors>
            <descriptor>static.xml</descriptor>
          </descriptors>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

static.xml

(dist - это каталог, куда ember-cli помещает скомпилированные ресурсы, которые мне нужно включить.)

<?xml version="1.0" encoding="UTF-8"?>
<assembly>
  <id>static</id>
  <formats>
    <format>war</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <fileSets>
    <fileSet>
      <directory>dist</directory>
      <includes>
        <include>**</include>
      </includes>
      <excludes>
        <exclude>WEB-INF/*</exclude>
      </excludes>
      <outputDirectory>/</outputDirectory>
    </fileSet>
    <fileSet>
      <directory>WEB-INF</directory>
      <includes>
        <include>**</include>
      </includes>
      <outputDirectory>/WEB-INF</outputDirectory>
    </fileSet>
  </fileSets>
</assembly>

У меня также есть файл web.xml в папке WEB-INF, но он по существу пуст.

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">

</web-app>

Итак, чтобы подвести итог вопроса: возможно ли иметь указанную логику маршрутизации без написания какого-либо Java-кода, то есть без какого-либо "склеивания" или "посредника" модуля на стороне сервера?

...