失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 如何将Angular8项目部署到(Java Web)war包上

如何将Angular8项目部署到(Java Web)war包上

时间:2018-11-17 00:00:03

相关推荐

如何将Angular8项目部署到(Java Web)war包上

根据Víctor Orozco的经验,有时候需要使用war文件作为容器来构建SPA(single page web application)单页web应用程序。

比如:

> 当你无法控制去部署基础设施的时候

> 当你正在处理一些刻板的部署标准的时候

> 当程序员很不情愿的去发布一个老套而简易的web服务时

不管怎样

正如Oracle官方文档中所描述的,使用war文件的好处之一就是可以在部署中引入静态(HTML/CSS/JS)文件。

因此,可以大胆地认为 war文件可以被作为包装器(需要特别考虑)来分发构建任何SPA。

用Angular8和Java War做一个POC(验证性测试)

为了证实这一点,我将创建一个项目:

1. 兼容三大Java IDE(NetBeans、IntelliJ、Eclipse)还有 VSCode

2. 可以将以上IDE作为开发JavaScript的IDE

3. 可以创建一个SPA应用(包含所有npm、ng、cli等)

4. 可以组合Java(Maven)+ JavaScript(Webpack)来构建系统

5. 可以发布一个小型的并且可用于生产的项目

构建一个简单的Java Web项目

你可以使用普通的maven-archetype-webapp作为基础来引导Java项目

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4

shell需要你提供一些项目特性,包括groupId、artifactId(项目名称)和基本包。

最后,你应该看到以下结构:

demo-angular-8$ tree.├── pom.xml└── src└── main└── webapp├── WEB-INF│ └── web.xml└── index.jsp4 directories, 3 file

现在,你应该可以在任何一个IDE中打开你的项目。默认情况下,pom.xml将包含一些Maven插件的固定版本。

你可以不用管这些,因为我们不会个性化整个Maven生命周期,只是几个hook。

(另外index.jsp也不需要,删掉它)

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.nabenik</groupId><artifactId>demo-angular-8</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>demo-angular-8 Maven Webapp</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><piler.source>1.7</piler.source><piler.target>1.7</piler.target></properties></project>

构建一个简单的Angular项目

首先因个人喜好我习惯将Angular项目放在前端 "src/main/frontend"目录中。

在之前使用AngularJS, Knockout, Ember等老框架,可以通过index.html中的几个includes来引导整个项目。而现在大多数前端项目使用Webpack来构建。

OK! 至此,我假定你已经安装了所有Angular CLI工具,接下来我们进入源码结构并引入Angular项目。

demo-angular-8$ cd src/main/demo-angular-8/src/main$ ng new frontend

这样将构建一个普通的Angular项目,实际上也可以将"src/main/frontend"文件夹当作一个单独的根目录(也可以直接从VSCode打开)。

最终项目结构如图:

作为第一次测试,我用IDEA 直接通过CLI 执行 " ng serve --open " 启动了项目, 一切如期而至。

从Maven调用Webpack

有个合适的插件叫 frontend-maven-plugin,可以使用它:

> 下载常见的JS包管理器(npm、cnpm、bower、yarn)

> 调用JS来构建系统和测试(grunt、gulp、webpack或npm本身、karma)

默认情况下,Angular 项目中从npm到ng带有hooks,但是我们需要在package.json中加个hook来创建一个[buildProduction],由于我使用的是Java约定中的默认路径(与项目名称相同)所以请仔细检查base-href参数

..."scripts": {"ng": "ng","start": "ng serve","build": "ng build","buildProduction": "ng build --prod --base-href /demo-angular-8/","test": "ng test","lint": "ng lint","e2e": "ng e2e"}...

我们可以执行 npm run buildProduction 来测试一下,在webproject的根目录(src/main/frontend)中,输出应该如下:

最后,有必要使用maven调用或新建 target

> 安装nodejs(和npm)

> 安装JS依赖

> 调用我们的新hook

> 把结果复制到最终可分配的war中

完成配置:

<build><finalName>demo-angular-8</finalName><plugins><plugin><groupId>com.github.eirslett</groupId><artifactId>frontend-maven-plugin</artifactId><version>1.6</version><configuration><workingDirectory>src/main/frontend</workingDirectory></configuration><executions><execution><id>install-node-and-npm</id><goals><goal>install-node-and-npm</goal></goals><configuration><nodeVersion>v10.16.1</nodeVersion></configuration></execution><execution><id>npm install</id><goals><goal>npm</goal></goals><configuration><arguments>install</arguments></configuration></execution><execution><id>npm build</id><goals><goal>npm</goal></goals><configuration><arguments>run buildProduction</arguments></configuration><phase>generate-resources</phase></execution></executions></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.2.2</version><configuration><failOnMissingWebXml>false</failOnMissingWebXml><!-- Add frontend folder to war package --><webResources><resource><directory>src/main/frontend/dist/frontend</directory></resource></webResources></configuration></plugin></plugins></build>

就这样!一旦执行mvn clean package,你将获得一个轻便的war文件,它将在任何Servlet容器中运行。然后用Payara Server 5测了一下如期而至。

原文来自:/articles/how-to-pack-angular-8-applications-on-regular-war

感谢大佬!

如果觉得《如何将Angular8项目部署到(Java Web)war包上》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。