46 votes

comment intégrer une application Web Angular 2 + Java Maven

J'ai créé une application frontale Angular 2 et j'ai créé une application dorsale Java Rest WS qui est connectée à la base de données.

La structure de mon dossier pour l'application Angular 2 est la suivante-

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

Et la structure de mon application Web Java Maven est la suivante

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

Je veux savoir comment intégrer ces deux applications en une seule qui ne produira qu'un seul fichier war.

0 votes

Je construis mon application en utilisant spring boot et nous jars pour angular2. Pour un exemple, voir github.com/Kiran-N/springboot-and-angular2

0 votes

J'ai eu une tâche similaire, voici mon approche stackoverflow.com/questions/37512154/

58voto

J_Dev Points 521

Voici ce que j'ai fait :-

  • Installez Nodejs v6.9+.
  • Exécuter npm install @angular/cli -g pour Angular CLI
  • Installez Apache Maven ou utilisez un IDE compatible avec Maven.
  • Utilisez votre configuration Maven requise, j'ai utilisé une simple webapp (WAR).

Structure de l'annuaire (Sauf pour ngapp Le reste du dossier est la structure standard de Maven).

ngfirst
 pom.xml
 src
    main
        java
        resources
        webapp
        ngapp

Partie angulaire

Ouvrir ngapp dans le terminal et tapez ng init pour initialiser la configuration de node et de npm, le résultat sera une application d'exemple Angular2 simple avec la structure de répertoire suivante dans le dossier 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

Cette structure est l'équivalent en Angular de la structure des projets Maven et src est la source de l'application Angular, tout comme le répertoire construction maven La commande génère sa sortie dans cible dossier, ng construire La commande génère sa sortie dans dist dossier.

Afin d'empaqueter l'application Angular générée dans le WAR généré par Maven, modifiez la configuration de construction pour changer le dossier de sortie de dist a webapp , ouvert angular-cli.json et modifiez son outDir comme suit:-

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

A ce stade ng construire La commande va générer une application Angular construite dans ng répertoire de ngfirst/src/main/ webapp dossier.

Partie Maven

Ouvrez pom.xml et configurez les trois plugins maven suivants:-

  1. compilateur-plugin : Aucun élément Java à compiler dans /src/main/ ngapp l'exclure.
  2. war-plugin : /src/main/ ngapp est le dossier du projet Angular et il ne doit pas être empaqueté dans le WAR, excluez-le.
  3. exec-plugin : Exécuter les commandes NPM Install et Angular-CLI Build pour générer l'application Angular dans le dossier webapp pour le packaging final. Notez l'argument --base-href, il est nécessaire pour charger les ressources Angular à partir du chemin du contexte de webapp.

Voici à quoi il devrait ressembler :-

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

Construction du projet Maven (et Angular App aussi)

Ouvrez un terminal dans le dossier racine du projet ngfirst et exécuter paquet mvn ce qui générera un fichier WAR (ngfirst.war) dans le répertoire cible dossier.

Déployer ngfirst.war dans un récipient, ouvert http://localhost:8080/ngfirst/ng/index.html dans le navigateur. (ajustez votre nom d'hôte et votre port si nécessaire)

Si tout s'est bien passé, vous devriez voir L'application fonctionne ! dans le navigateur, c'est l'application Angular au travail !

Prétraitement JSP

Nous pouvons tirer parti de la configuration dynamique et des capacités de rendu de page de la technologie JSP avec l'application Angular. La SPA Angular est servie par le conteneur Java comme une page HTML ordinaire, index.html dans ce cas, si nous configurons le moteur JSP pour qu'il pré-traite également les fichiers html, alors toute la magie JSP peut être incluse dans la page Angular SPA, il suffit d'inclure ce qui suit dans la page web.xml

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

Sauvegarder, reconstruire le projet maven, déployer WAR et voilà !

2 votes

Je recommande d'utiliser <warSourceExcludes>ngapp/**</warSourceExcludes> pour exclure le dossier ngapp ou packagingExcludes>

0 votes

@J_Dev cela fonctionne bien. le problème est que le jar inclut également les modules Node. comment puis-je inclure seulement les modules ng serve --prod o ng build sortie ?

0 votes

@J_Dev - Pouvez-vous expliquer pourquoi vous excluez ngapp de la guerre ? Je pensais que cette question concernait l'intégration/le regroupement de l'application Angular 2 et du code Java dans le même fichier War. Si vous l'excluez, comment le code angulaire sera-t-il déployé ?

13voto

boly38 Points 118

De mon côté, j'ai un module maven pour les sources angulaires appelé prj-angulaire et un autre pour l'application de guerre appelé prj-guerre .

premièrement prj angulaire est construit :

  • il utilise maven-exec-plugin pour appeler npm install y ng build (merci à @J_Dev !)
  • changer le répertoire par défaut des ressources en dist/
  • sauter la génération de jar MANIFEST
  • résultat du module maven : un jar avec angular généré dist/ contenu uniquement !

alors, deuxièmement prj_war est construit :

  • a prj angulaire comme dépendance
  • utiliser la phase unpack pour dézipper le jar précédent dans la destination web app
  • Ce module vous permet de construire une application avec une nouvelle dist angulaire.

Suivez sous la configuration du plugin correspondant que j'ai utilisé :

prj angular (extrait 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 (extrait pom.xml)

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

0 votes

J'ai récemment découvert github.com/eirslett/frontend-maven-plugin

8voto

Scrambo Points 372

C'est drôle, j'ai fait ça la semaine dernière !

Utilisation de Netbeans 8.1 et d'un servlet Tomcat version 8.0.27

Structure des fichiers des projets Angular et Java.

Le projet Java s'appelle Foo. Le projet Angular s'appelle Bar

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

3voto

Caio Leonhardt Points 85

Je recommande de laisser les deux applications séparées, de cette façon vous avez la modularité. De cette façon, vous pouvez changer l'application Angular sans affecter votre service, et vice versa. En second lieu, votre apache/nginx est plus rapide pour livrer vos js et html d'Angular au lieu de Tomcat (par exemple). Mais si vous voulez toujours mettre l'application Angular à l'intérieur du war, le modèle est que toutes les ressources web sont dans src/main/webapp.

0 votes

De cette façon, j'ai essayé de mettre toutes les ressources web sous src/main/webapp, mais ici je suis confronté à un problème comme angular2 est construit sur typescript, donc le serveur tomcat ne peut pas compiler ces fichiers et l'application est bloquée.

0 votes

C'est vrai peut-être que ceci peut vous aider alors : stackoverflow.com/a/37398298/2285259

2voto

xcesco Points 896

Je veux partager la façon dont je configure mes projets Angular/Java. Quelques éléments importants :

  1. Il n'y a qu'un seul projet Maven et il me permet de construire l'ensemble du projet. De cette façon, je peux construire le projet entier ou construire le client et le backend séparément.

  2. Mon projet est basé sur le framework Spring Boot. Cependant, vous pouvez facilement adapter ma solution à votre situation. Je génère le output Le code du projet Angular est placé dans le dossier `META-INF'. Vous pouvez évidemment le modifier si vous n'utilisez pas Spring Boot.

  3. Dans mon projet, je veux publier le projet angulaire dans la section public dossier.

  4. Lorsque je développe, j'exécute le projet Angular et le projet backend séparément : Angular avec ng serve et le projet backend (la partie Java) dans l'IDE (Eclipse).

Ok, commençons. La structure complète du projet est représentée dans l'image suivante.

Project structure

Comme vous pouvez le voir, j'ai placé le projet Angular dans le répertoire 'src'. \main\ngapp dossier. Pour le projet Java (le backend) j'ai utilisé Eclipse IDE, pour le projet Angular j'ai utilisé Webstorm. Vous pouvez choisir votre IDE préféré pour gérer le projet. L'important : vous aurez besoin de deux IDE pour gérer l'ensemble du projet.

Pour construire le projet Angular avec Maven, j'ai utilisé la définition de profil maven suivante.

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

Comme vous pouvez le voir, j'ai utilisé le com.github.eirslett:frontend-maven-plugin pour installer node et exécuter npm pour construire le projet Angular. De cette façon, lorsque je lance le profil maven build-client Le plugin est utilisé pour :

  • Vérifier et installer, si nécessaire, la version du nœud. v10.13.0 dans le dossier du projet Angular src/main/ngapp/

  • Exécutez la commande npm run build . Dans le projet Angular, l'alias de construction est défini dans le fichier 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" }

Le client Angular doit être placé dans public de l'application web. Pour ce faire, le projet Angular est configuré de manière à ce que l'option baseHref=/public . En outre, le projet construit doit être placé dans src/main/resources/META-INF/resources/public . En angular.json vous trouverez :

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

Dans un projet sans Spring Boot, vous devrez probablement placer le projet angulaire construit directement dans le répertoire src/main/webapp/public dossier. Pour ce faire, il suffit de modifier le fichier angular.json selon vos besoins.

Vous pouvez trouver tout le code du projet dans mon projet github . Le projet de plugin est aquí .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X