Как интегрировать Angular 2 + Java Maven Web Application

Я создал внешнее приложение Angular 2 и создал одно внутреннее приложение Java Rest WS, которое подключено к БД.

Структура моей папки для приложения Angular 2 - below-

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 - below-

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

Я хочу знать, как объединить эти два приложения в одно приложение, которое будет создавать только один файл военных действий.

Ответ 1

Вот что я сделал: -

  • Установить Nodejs v6.9 +
  • Запустите npm install @angular/cli -g для Angular CLI
  • Установите Apache Maven или используйте любую дружественную IDE для Maven
  • Используйте требуемую конфигурацию Maven, я использовал простой webapp (WAR).

Структура каталогов (за исключением ngapp) - это стандартная структура Maven.)

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

Angular Часть

Откройте 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. Источник приложения, так же как команда maven build генерирует свой вывод в target, команда ng build генерирует свой вывод в папке dist.

Чтобы упаковать сгенерированное приложение Angular в Maven, сгенерированное WAR, измените конфигурацию сборки, чтобы изменить выходную папку с dist на webapp, откройте w506 > -cli.json и изменить его outDir, как показано ниже: -

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

В этот момент команда ng build создаст встроенное Angular приложение внутри каталога ng папки ngfirst/src/main/ webapp.

Часть Maven

Откройте pom.xml и настройте следующие три плагина maven: -

  • компилятор-плагин: нет файлов Java для компиляции в /src/main/ ngapp папке, исключайте его.
  • war-plugin:/src/main/ ngapp - это папка проекта Angular, и она не должна быть упакована в WAR, исключите ее.
  • exec-plugin. Выполните установку NPM и Angular -CLI. Создайте команды для создания приложения Angular в папке webapp для окончательной упаковки. Примечание. --base-href аргумент, требуется загрузить ресурсы Angular из контекста контекста webapp.

Вот как это должно выглядеть: -

<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 (и Angular приложение тоже)

Откройте терминал в корневой папке проекта ngfirst и запустите команду mvn package, это приведет к созданию WAR файла (ngfirst.war) в target папку.

Разверните ngfirst.war в контейнере, откройте http://localhost:8080/ngfirst/ng/index.html в браузере. (при необходимости измените имя хоста и порт)

Если все пошло правильно, вы должны увидеть приложение работает! в браузере, то есть Angular Приложение на работе!

Предварительная обработка JSP

Мы можем использовать возможности динамической конфигурации и рендеринга страниц технологии JSP с приложением Angular, Angular SPA обслуживается контейнером Java как обычная HTML-страница, index.html в этом случае, если мы настроим JSP Engine для предварительной обработки файлов html, тогда вся магия JSP может быть включена внутри Angular Страница SPA, просто включите следующее внутри web.xml

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

Сохранить, перестроить проект maven, развернуть WAR и voila!!

Ответ 2

Моя сторона У меня есть модуль maven для angular источников, называемых prj- angular, и анотер для военного приложения, называемый prj-war.

сначала prj angular:

  • он использует maven-exec-plugin для вызова npm install и ng build (благодаря @J_Dev!)
  • изменить каталог ресурсов ресурса на dist/
  • skip jar Генерация MANIFEST
  • Результат модуля maven: банку с созданным содержимым angular dist/!

тогда второй prj_war будет создан:

  • имеет prj angular как зависимость
  • используйте распаковую фазу, чтобы распаковать предыдущую банку в пункт назначения веб-приложения.
  • этот модуль создаст вам войну приложений со свежим angular dist.

Следуйте за соответствующей конфигурацией плагина, которую я использовал:

prj angular (извлечение pom.xml)

<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>

Ответ 3

Как ни странно, я сделал это только на прошлой неделе!

Использование Netbeans 8.1 и сервлет Tomcat версии 8.0.27

Angular и структуру файла проекта Java.

Java Project называется Foo. Angular Проект - это бар

Foo (Java Maven Project)
|__ src
|    |__ main
|    |    |__ webapp (This folder contains the entire Angular Project)
|    |    |    |__ META-INF
|    |    |    |    \__ context.xml 
|    |    |    |__ WEB-INF
|    |    |    |    \__ web.xml
|    |    |    |__ includes
|    |    |    |    |__ css
|    |    |    |    |__ images
|    |    |    |    \__ js
|    |    |    |
|    |    |    | ## Bar project files are located here ##
|    |    |    |
|    |    |    |__ app
|    |    |    |    \__ All .ts and compiled .js files are located here
|    |    |    |__ node_modules
|    |    |    |    \__ any dependencies used for Bar are located here
|    |    |    |__ typings
|    |    |    |    \__ typings for Typescript located here
|    |    |    |
|    |    |    |__ README.txt
|    |    |    |__ index.jsp
|    |    |    |__ package.json
|    |    |    |__ systemjs.config.js
|    |    |    |__ tsconfig.json
|    |    |    |__ typings.json
|    |    |    \ ## Bar project files end here
|    |    | 
|    |    |__ resources
|    |    |    |__META-INF
|    |    |    |    \__ persistence.xml
|    |    |__ java
|    |    |    |__ hibernate.cfg.xml
|    |    |    |__ com
|    |    |    |    |__ orgName
|    |    |    |    |    |__ packageName
|    |    |    |    |    |    \__ .java files are here
|__ pom.xml
\__ nb-configuration.xml

Ответ 4

Я рекомендую отделить два приложения, таким образом, у вас есть модульность. Таким образом вы можете изменить приложение Angular, не влияя на ваш сервис, и наоборот. Во-вторых, ваш apache/nginx быстрее отправит ваши js и html из Angular вместо Tomcat (например). Но если вы все еще хотите поместить приложение Angular в войну, шаблон состоит в том, что все веб-ресурсы находятся в src/main/webapp.

Ответ 5

Я хочу поделиться тем, как настроить мои Angular/Java проекты. Некоторые важные вещи:

  1. Там только один проект Maven, и это позволяет мне построить весь проект. Это не означает, что я всегда могу создать внешний интерфейс и внутренний интерфейс отдельно.

  2. Мой проект основан на платформе Spring Boot. Тем не менее, вы можете легко адаптировать мое решение к вашей ситуации. Я генерирую output код Angular проекта, который находится в папке "META-INF". Очевидно, вы можете изменить его, если не используете Spring Boot.

  3. В моем проекте я хочу опубликовать angular проект в папке public.

  4. Когда я разрабатываю, я запускаю проект Angular и бэкэнд-проект отдельно: Angular с ng serve и бэкэнд-проект (часть Java) в IDE (Eclipse).

Хорошо, давай начнем. Вся структура проекта представлена на следующем рисунке.

Project structure

Как видите, я поместил проект Angular в папку 'src\main\ngapp'. Для проекта Java (бэкэнд) я использовал Eclipse IDE, для проекта Angular я использовал Webstorm. Вы можете выбрать предпочитаемую IDE для управления проектом. Важная вещь: вам понадобятся две IDE для управления всем проектом.

Чтобы создать проект Angular с помощью Maven, я использовал следующее определение профиля maven.

<profile>
    <id>build-client</id>

    <build>
        <plugins>
            <plugin>
                <groupId>com.github.eirslett</groupId>
                <artifactId>frontend-maven-plugin</artifactId>
                <version>1.3</version>
                <configuration>
                    <nodeVersion>v10.13.0</nodeVersion>
                    <npmVersion>6.4.1</npmVersion>
                    <workingDirectory>src/main/ngapp/</workingDirectory>
                </configuration>
                <executions>
                    <execution>
                        <id>install node and npm</id>
                        <goals>
                            <goal>install-node-and-npm</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>npm install</id>
                        <goals>
                            <goal>npm</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>npm run build-prod</id>
                        <goals>
                            <goal>npm</goal>
                        </goals>
                        <configuration>
                            <arguments>run build</arguments>
                        </configuration>
                    </execution>
                    <execution>
                        <id>prod</id>
                        <goals>
                            <goal>npm</goal>
                        </goals>
                        <configuration>
                            <arguments>run-script build</arguments>
                        </configuration>
                        <phase>generate-resources</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

Как видите, я использовал плагин com.github.eirslett:frontend-maven-plugin для установки узла и запуска npm для сборки проекта Angular. Таким образом, когда я запускаю профиль maven build-client, плагин используется для:

  • Проверьте и, если необходимо, установите версию узла v10.13.0 в папке проекта Angular src/main/ngapp/

  • Запустите команду npm run build. В проекте Angular определен псевдоним сборки в package.json

"scripts": {
    "ng": "ng",
    "start": "ng serve --proxy-config proxy.conf.json",
    "build": "ng build --configuration=production",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
}

Клиент Angular должен находиться в папке public веб-приложения. Для этого проект Angular настроен на использование baseHref=/public. Кроме того, построенный проект должен быть размещен в src/main/resources/META-INF/resources/public. В angular.json вы найдете:

"build": {
  "builder": "@angular-devkit/build-angular:browser",
  "options": {
    "baseHref":"/public/",
    "outputPath": "../resources/META-INF/resources/public",
    ...    

В проекте без Spring Boot вам, вероятно, нужно поместить собранный angular проект прямо в папку src/main/webapp/public. Для этого просто измените файл angular.json, как вам нужно.

Вы можете найти весь код проекта в моем проекте github. Проект плагина находится здесь.