如何集成Angular 2 + Java Maven Web Application

我创建了一个Angular 2前端应用程序,并创建了一个连接到DB的Java Rest WS后端应用程序。

我的Angular 2应用程序的文件夹结构如下-

Angular2App
  confg
  dist
  e2e
  node_modules
  public
  src
     app
     favicon.ico
     index.html
     main.ts
     system-config.ts
     tsconfig.json
     typings.d.ts
  tmp
  typings
  .editorconfig
  .gitignore
  angular-cli.json
  angular-cli-build.js
  package.json
  README.md
  tslint.json
  typings.json

而我的Java Maven Web Application Structure如下——

JerseyWebApp
  src
   main
     java
       Custom Package
       java classes
     resources
     webapp
       WEB-INF
         web.xml
       index.html
  pom.xml

我想知道如何将这两个应用程序集成到一个应用程序中,该应用程序将仅生成一个war文件。


答案 1

以下是我所做的:-

  • 安装 Nodejs v6.9+
  • 运行 npm install @angular/cli –g for Angular CLI
  • 安装Apache Maven或使用任何对Maven友好的IDE
  • 使用您所需的Maven配置,我使用了简单的webapp(WAR)。

目录结构(除了ngapp文件夹休息是标准的Maven结构。

ngfirst
├── pom.xml
├── src
│   └── main
│       ├── java
│       ├── resources
│       ├── webapp
│       └── ngapp

角度部分

在终端中打开ngapp文件夹并键入ng init命令来初始化node和npm配置,结果将是一个简单的Angular2示例应用程序将在ngapp文件夹内使用以下目录结构:-

             ├── angular-cli.json
             ├── e2e
             ├── karma.conf.js
             ├── node_modules
             ├── package.json
             ├── protractor.conf.js
             ├── README.md
             ├── tslint.json
             ├── src
                 ├── app
                 ├── assets
                 ├── environments
                 ├── favicon.ico
                 ├── index.html
                 ├── main.ts
                 ├── polyfills.ts
                 ├── styles.css
                 ├── test.ts
                 └── tsconfig.json

这种结构是 Maven 项目结构的 Angular 等价物,src 目录是 Angular Application 的源代码,就像 maven 构建命令在目标文件夹中生成其输出一样,ng build 命令在 dist 文件夹中生成其输出。

为了在Maven生成的WAR中打包生成的Angular应用程序,修改构建配置以将输出文件夹从dist更改为webapp,打开angular-cli.json文件并修改其outDir,如下所示:-

"outDir": "../webapp/ng"

此时,ng build 命令将在 ngfirst/src/main/webapp 文件夹的 ng 目录中生成已构建的 Angular 应用程序。

马文部分

打开pom.xml并配置以下三个maven插件:-

  1. 编译器插件:没有Java的东西可以在/src/main/ngapp文件夹中编译,排除它。
  2. war-plugin: /src/main/ngapp 是 Angular project 文件夹,它不应该打包在 WAR 中,排除它。
  3. exec-plugin:执行 NPM Install 和 Angular-CLI Build 命令,在 webapp 文件夹中生成 Angular Application 以进行最终打包。注意 --base-href 参数,需要从 webapp 的上下文路径加载 Angular 资源。

这是它应该是什么样子的:-

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
            <excludes>
                <exclude>ngapp/**</exclude>
            </excludes>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.0.0</version>
        <configuration>
            <excludes>
                <exclude>ngapp/**</exclude>
            </excludes>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.5.0</version>
        <executions>
            <execution>
                <id>exec-npm-install</id>
                <phase>generate-sources</phase>
                <configuration>
                    <workingDirectory>${project.basedir}/src/main/ngapp</workingDirectory>
                    <executable>npm</executable>
                    <arguments>
                        <argument>install</argument>
                    </arguments>
                </configuration>
                <goals>
                    <goal>exec</goal>
                </goals>
            </execution>
            <execution>
                <id>exec-npm-ng-build</id>
                <phase>generate-sources</phase>
                <configuration>
                    <workingDirectory>${project.basedir}/src/main/ngapp</workingDirectory>
                    <executable>ng</executable>
                    <arguments>
                        <argument>build</argument>
                        <argument>--base-href=/ngfirst/ng/</argument>
                    </arguments>
                </configuration>
                <goals>
                    <goal>exec</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>  

Building Maven Project(以及Angular App)

在项目根文件夹ngfirst中打开终端并运行mvn包命令,这将在目标文件夹中生成一个WAR文件(ngfirst.war)。

在容器中部署ngfirst.war,在浏览器中打开 http://localhost:8080/ngfirst/ng/index.html。(如果需要,请调整主机名和端口)

如果一切顺利,你应该看到应用程序工作!在浏览器中,那就是Angular应用程序在工作!

JSP 预处理

我们可以将JSP技术的动态配置和页面渲染功能与Angular应用程序一起使用,Angular SPA由Java容器作为常规HTML页面,索引提供.html在这种情况下,如果我们配置JSP引擎来预处理html文件,那么所有的JSP魔术都可以包含在Angular SPA页面中,只需在Web内部包含以下内容.xml

<servlet-mapping>
    <servlet-name>jsp</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

保存,重建专家项目,部署WAR,瞧!!


答案 2

我这边有一个用于角源的 maven 模块,称为 prj-angular,以及一个用于战争应用的 maven 模块,称为 prj-war

构建了第一个 prj angular

  • 它使用maven-exec-plugin来调用和(感谢@J_Dev!npm installng build
  • 将资源默认目录更改为dist/
  • 跳过 jar 清单生成
  • maven 模块结果:一个仅生成角度 dist/内容的 jar!

然后,第二个prj_war是构建:

  • 具有 prj 角作为依赖关系
  • 使用解包阶段将上一个 jar 解压缩到 Web 应用目标中
  • 这个模块用新鲜的角度构建你的应用程序战争。

按照我使用的相应插件配置进行操作:

prj angular (pom.xml extract)

<build>
    <resources>
        <resource>
            <directory>dist</directory>
        </resource>
    </resources>
    <plugins>
        <!-- skip compile -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <executions>
                <execution>
                    <id>default-compile</id>
                    <phase />
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>exec-npm-install</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}</workingDirectory>
                        <executable>npm.cmd</executable>
                        <arguments>
                            <argument>install</argument>
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
                <execution>
                    <id>exec-npm-ng-build</id>
                    <phase>generate-sources</phase>
                    <configuration>
                        <workingDirectory>${project.basedir}/src</workingDirectory>
                        <executable>ng.cmd</executable>
                        <arguments>
                            <argument>build</argument>
                            <argument>--no-progress</argument>
                            <argument>--base-href=/app/ng/</argument> <== to update
                        </arguments>
                    </configuration>
                    <goals>
                        <goal>exec</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <addMavenDescriptor>false</addMavenDescriptor>
                    <manifest>
                        <addClasspath>false</addClasspath>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/</exclude>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

prj war (pom.xml extract)

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack angular distribution</id>
                    <phase>generate-resources</phase>
                    <goals>
                        <goal>unpack</goal>
                    </goals>
                    <configuration>
                        <artifactItems>
                            <artifactItem>
                                <groupId>com.myapp</groupId> <== to update
                                <artifactId>prj-angular</artifactId> <== to update
                                <overWrite>true</overWrite>
                                <includes>**/*</includes>
                            </artifactItem>
                        </artifactItems>
                        <outputDirectory>${project.build.directory}/prjwar/ng</outputDirectory> <== to update
                        <overWriteReleases>true</overWriteReleases>
                        <overWriteSnapshots>true</overWriteSnapshots>
                    </configuration>
                </execution>
            </executions>
        </plugin>

推荐