单个 WAR 中的 Angular 4 和 Java 后端项目

Posted

技术标签:

【中文标题】单个 WAR 中的 Angular 4 和 Java 后端项目【英文标题】:Angular 4 and Java BackEnd Project in a single WAR 【发布时间】:2018-07-11 13:23:50 【问题描述】:

我创建了一个 Angular 4 项目并使用 JAVA REST API 项目作为后端。我需要我可以将我的 angular 4 项目作为 JAVA 战争文件中的静态内容移动。

我为 Angular 项目创建了生产版本,并从 dist 文件夹复制文件并将其粘贴到 java 项目的 webcontent 中。我能够读取角度项目的索引文件,但其他文件给出 404。

请帮助我如何在我的 java 项目中移动我的 angular 项目以获取用于生产的单个 war 文件。

WEB.XML :-

    <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>userInformation</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Jersey RESTful Application</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>com.newgen.ap2</param-value>
    </init-param>
    <init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>com.newgen.ap2.CrossOrigin</param-value>
 </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey RESTful Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping> 
</web-app>

【问题讨论】:

你为什么要这样做? 检查这个***.com/questions/45915379/…或这个github.com/marco76/java-demo 这两个都用 Maven 但我不想用 maven... @NishantVarshney 是的,我明白是什么,这就是让我感到困惑的原因。您确定要在每次更改 UI 中的标签时更改后端的部署?他们甚至没有理由必须在同一台服务器上运行,更不用说同一个 war 文件了 【参考方案1】:

将您的 web.xml 更改为以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>userInformation</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Jersey RESTful Application</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>com.newgen.ap2</param-value>
    </init-param>
    <init-param>
    <param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
    <param-value>com.newgen.ap2.CrossOrigin</param-value>
 </init-param>
  </servlet>
  <servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
</servlet>
  <servlet-mapping>
    <servlet-name>Jersey RESTful Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping> 

<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

这个想法是使用不同的 Servlet 来为您的静态资源提供服务。

这里还有一些可能有用的 SO 帖子:

Servlet filters' order of execution

How are Servlet url mappings in web.xml used?

What happens if I have two servlet mappings in web.xml that match a request?

【讨论】:

以上是关于单个 WAR 中的 Angular 4 和 Java 后端项目的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Spring Boot Rest 服务和 Angular App 捆绑在一个 war 文件中

根据 Angular 中的标题对表格中单列中的数据进行排序

使用war将spring-boot和angular 7应用程序部署到tomcat 8.5中

如何根据 Angular 6 中的 Firebase 实时数据库中的键获取单个记录

将 WAR 部署到 Tomcat(Spring Boot + Angular)

我可以在多个环境中使用单个 war 文件吗?我是否该?