简体   繁体   English

如何在基于maven的java war项目中设置angular 4

[英]How to setup angular 4 inside a maven based java war project

I'm becoming a bit crazy because I can't find a guide to setup an angular 4 app inside a java war project that will be built with maven. 我变得有点疯狂,因为我找不到在使用maven构建的java war项目中设置角度4 app的指南。 This is because I want to run it into a wildfly server. 这是因为我想将它运行到wildfly服务器中。

Any help? 有帮助吗?

Thanks 谢谢

I had similar requirement to have one source project which has java web-services project as well as angular project(an angular-cli based project) and maven build should create a war with all angular files in it. 我有类似的要求,有一个源项目,它有java web服务项目以及角度项目(基于角度cli的项目)和maven构建应该创建一个包含所有角度文件的战争。 I used maven-frontend-plugin with few configuration changes for base path. 我使用了maven-frontend-plugin ,基本路径的配置更改很少。

The goal was to create a war file with all the java code in it plus all the aot compiled angular code in root folder of war, all this with single command mvn clean package . 目标是创建一个war文件,其中包含所有java代码以及war根文件夹中所有已编译的角度代码,所有这些都使用单个命令mvn clean package

One more thing for all this to work is to avoid conflict between angular-app router urls and your java application urls, You need to use HashLocationStrategy. 所有这一切工作的另一件事是避免angular-app路由器URL和你的java应用程序URL之间的冲突,你需要使用HashLocationStrategy。 one way set it up in app.module.ts like below 一种方法在app.module.ts中设置它,如下所示

app.module.ts - app.module.ts -

providers: [
    { provide: LocationStrategy, useClass: HashLocationStrategy },

]

Folder structure for Angular App is below- Angular App的文件夹结构如下 -

angular-project 角项目

  • dist DIST
  • e2e E2E
  • node_modules node_modules
  • public 上市
  • src SRC
    • app 应用
    • assets 资产
    • environments 环境
    • favicon.ico favicon.ico的
    • index.html 的index.html
    • main.ts main.ts
    • polyfills.ts polyfills.ts
    • style.css style.css文件
    • tsconfig.json tsconfig.json
    • typings.d.ts typings.d.ts
    • etc-etc 等等,等等
  • tmp TMP
  • .angular-cli.json .angular-cli.json
  • .gitignore 的.gitignore
  • karma.conf.js karma.conf.js
  • package.json 的package.json
  • README.md README.md
  • tslint.json tslint.json
  • etc - etc 等等 - 等等

Maven Project - Maven项目 -

  • src SRC
    • main 主要
      • java java的
      • resources 资源
      • webapp Web应用程序
        • WEB-INF WEB-INF
        • web.xml web.xml中
  • angular-project ( place your angular project here ) 角度项目( 将角度项目放在这里
  • node_installation node_installation
  • pom.xml 的pom.xml

Add maven-frontend-plugin configuration to pom.xml 将maven-frontend-plugin配置添加到pom.xml

 <properties>
    <angular.project.location>angular-project</angular.project.location>
    <angular.project.nodeinstallation>node_installation</angular.project.nodeinstallation>
</properties>

 <plugin>
            <groupId>com.github.eirslett</groupId>
            <artifactId>frontend-maven-plugin</artifactId>
            <version>1.0</version>
            <configuration>
                <workingDirectory>${angular.project.location}</workingDirectory>
                <installDirectory>${angular.project.nodeinstallation}</installDirectory>
            </configuration>
            <executions>
                <!-- It will install nodejs and npm -->
                <execution>
                    <id>install node and npm</id>
                    <goals>
                        <goal>install-node-and-npm</goal>
                    </goals>
                    <configuration>
                        <nodeVersion>v6.10.0</nodeVersion>
                        <npmVersion>3.10.10</npmVersion>
                    </configuration>
                </execution>

                <!-- It will execute command "npm install" inside "/e2e-angular2" directory -->
                <execution>
                    <id>npm install</id>
                    <goals>
                        <goal>npm</goal>
                    </goals>
                    <configuration>
                        <arguments>install</arguments>
                    </configuration>
                </execution>
                <!-- It will execute command "npm build" inside "/e2e-angular2" directory 
                    to clean and create "/dist" directory -->
                <execution>
                    <id>npm build</id>
                    <goals>
                        <goal>npm</goal>
                    </goals>
                    <configuration>
                        <arguments>run build</arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <!-- Plugin to copy the content of /angular/dist/ directory to output 
            directory (ie/ /target/transactionManager-1.0/) -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.4.2</version>
            <executions>
                <execution>
                    <id>default-copy-resources</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <overwrite>true</overwrite>
                        <!-- This folder is the folder where your angular files 
                        will be copied to. It must match the resulting war-file name.
                        So if you have customized the name of war-file for ex. as "app.war"
                        then below value should be ${project.build.directory}/app/ 
                        Value given below is as per default war-file name -->
                        <outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}/</outputDirectory>
                        <resources>
                            <resource>
                                <directory>${project.basedir}/${angular.project.location}/dist</directory>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>

As above plugin call 'npm run build' internally, make sure package.json should have build command in script like below - 如上面的插件在内部调用'npm run build',请确保package.json应该在脚本中具有build命令,如下所示 -

package.json 的package.json

"scripts": {
    -----//-----,
    "build": "ng build --prod",
   -----//------
}

index.html should always be loaded when someone hit application from browser that's why make it a welcome file . 当有人从浏览器点击应用程序时,应始终加载index.html,这就是为什么要将它作为欢迎文件。 For web services lets say we have path /rest-services/* will explain this later. 对于Web服务,我们可以说我们有路径/ rest-services / *将在稍后解释。

web.xml - web.xml -

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

<servlet-mapping>
    <servlet-name>restservices</servlet-name>
    <url-pattern>/restservices/*</url-pattern>
</servlet-mapping>

The above configuration is enough if your application does not have any context path and is deployed on root path on server. 如果您的应用程序没有任何上下文路径并且部署在服务器上的根路径上,则上述配置就足够了。 But if your application has any context path like http://localhost:8080/myapplication/ then make changes to index.html file as well - 但是,如果您的应用程序有任何上下文路径,如http:// localhost:8080 / myapplication /,那么也可以对index.html文件进行更改 -

angular-project/src/index.html - Here document.location will be myapplication/ (the context path of your app otherwise / if application has no context path ) angular-project / src / index.html - 这里document.location将是myapplication /(否则应用的上下文路径/如果应用程序没有上下文路径)

The purpose of making context path a base path for angular-app is that whenever you make ajax http call from angular, it will prepend base path to url. 使上下文路径成为angular-app的基本路径的目的是,无论何时从angular进行ajax http调用,它都会将基本路径添加到url之前。 for example if i try to call 'restservices/persons' then it will actually make calls to ' http://localhost:8080/myapplication/restservices/persons ' 例如,如果我尝试调用'restservices / persons',那么它实际上会调用' http:// localhost:8080 / myapplication / restservices / persons '

index.html 的index.html

 <!doctype html>
 <html lang="en">
 <head>
   <meta charset="utf-8">
   <title>E2E</title>
   <script>document.write('<base href="' + document.location + '" />');     </script>

   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="icon" type="image/x-icon" href="favicon.ico">
 </head>
 <body>
   <app-root></app-root>
 </body>

After all above changes once you run mvn clean package it will create required war. 完成上述所有更改后,一旦运行mvn clean package ,它将创建所需的war。 Check if all the content of angular 'dist' folder is in root of war file. 检查角度'dist'文件夹的所有内容是否都在war文件的根目录中。

I have a similar issue : I have a maven web application module named Tourism-Services containing the web services and a maven project containing the angular project (I created the angular project with CLI in the src/main/angular5/tourism folder) 我有一个类似的问题:我有一个名为Tourism-Services的maven Web应用程序模块,其中包含Web服务和包含angular项目的maven项目(我在src / main / angular5 / tourism文件夹中使用CLI创建了角度项目)

在此输入图像描述

contrary to this post and accordingly to the following link ( how to integrate Angular 2 + Java Maven Web Application ) that was given by Parth Ghiya, I think that The angular project should be placed in the webapp folder of Tourism-Services module project. 与这篇文章相反,并且相应于Parth Ghiya给出的以下链接( 如何集成Angular 2 + Java Maven Web应用程序 ),我认为角度项目应该放在Tourism-Services模块项目的webapp文件夹中。 Considering this I have further questions : 考虑到这一点,我还有其他问题:

  1. Normally, all the compilation result in dist folder should be placed under webapp folder. 通常,dist文件夹中的所有编译结果都应该放在webapp文件夹下。 But in dist folder, there are not all the Angular project ressources (as images, css that should be present in angular assets folder, am I right ?) 但是在dist文件夹中,并不是所有的Angular项目资源(作为图像,css应该出现在angular assets文件夹中,我是对的吗?)

  2. Considering the angular dependencies that are in node_modules, should we integrate them also in webapp folder ? 考虑到node_modules中的角度依赖关系,我们是否应该将它们集成到webapp文件夹中? There is one obstacle : first there are Typescript files and sould be also compiled to be interprated by the server, but maybe there are compiled and added when they are imported in the custom application angular files ? 有一个障碍:首先是Typescript文件,并且还可以编译为由服务器进行交互,但是在自定义应用程序角度文件中导入时可能会编译和添加? What is the solution ? 解决办法是什么 ?

  3. Should we includes other type of ressources coming from the angular project in webapp folder ? 我们是否应该包含来自webapp文件夹中的角度项目的其他类型的资源? (like typings folder as suggested Scrambo in the above link post) (如上面链接帖中提到的Scrambo的打字文件夹)

I tried those instructions and other articles. 我试过那些说明和其他文章。 those are great however it is a bit ambiguous. 那些很棒,但它有点含糊不清。 So someone who doesn't get it at once .. checks this. 所以有人不能立刻得到它......检查一下。

GitHub GitHub上

Follow the below instructions.. 请按照以下说明操作..

  1. Add your angular project under java project. 在java项目下添加角度项目。 My angular project name is tdf 我的角项目名称是tdf 项目结构

2.open app.module.ts (in your angular project/src/app/app.module.ts) Add import and providers 2.打开app.module.ts(在你的角度项目/ src / app / app.module.ts中)添加导入和提供者

import { LocationStrategy, HashLocationStrategy } from '../../node_modules/@angular/common';

      providers: [
        { provide: LocationStrategy, useClass: HashLocationStrategy },
      ],

3.open package.json (angularproject/package.json) add "build": "ng build --prod" like below 3.open package.json(angularproject / package.json)添加“build”:“ng build --prod”如下所示

{
  "name": "tdf",
  "version": "0.0.0",
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
     **"build": "ng build --prod",** //change like this
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },

4.update your pom.xml -add forntend maven plugin -add ng build directory 4.更新你的pom.xml -add forntend maven plugin -add ng build目录

      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>

          <groupId>angular</groupId>
          <artifactId>angular7java</artifactId>
          <version>0.0.1-SNAPSHOT</version>
          <packaging>war</packaging>

          <name>angular7java</name>
          <url>http://maven.apache.org</url>

          <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>   
            **<angular.project.location>tdf</angular.project.location>**
            <!--your project name -->
            <angular.project.nodeinstallation>node_installation</angular.project.nodeinstallation>
          </properties>

          <dependencies>
            <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>3.8.1</version>
              <scope>test</scope>
            </dependency>
          </dependencies>

          <build>
           <plugins>    
                <plugin>
                        <groupId>com.github.eirslett</groupId>
                        <artifactId>frontend-maven-plugin</artifactId>
                        <version>1.6</version>
                        <configuration>
                        <workingDirectory>${angular.project.location}</workingDirectory>
                        <installDirectory>${angular.project.nodeinstallation}</installDirectory>
                         </configuration>
                        <executions>
                            <execution>
                                <id>install node and npm</id>
                                <goals>
                                    <goal>install-node-and-npm</goal>
                                </goals>
                                <configuration>
                                   <nodeVersion>v9.9.0</nodeVersion>
                                </configuration>
                            </execution>

                            <execution>
                                <id>npm install</id>
                                <goals>
                                    <goal>npm</goal>
                                </goals>
                                <!-- Optional configuration which provides for running any npm command -->
                                <configuration>
                                    <arguments>install</arguments>
                                </configuration>
                            </execution>

                             <execution>
                            <id>npm build</id>
                            <goals>
                                <goal>npm</goal>
                            </goals>
                            <configuration>
                                <arguments>run build</arguments>
                            </configuration>
                        </execution>

                        </executions>
                    </plugin>

                <!-- Plugin to copy the content of /angular/dist/ directory to output 
                    directory (ie/ /target/transactionManager-1.0/) -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>2.4.2</version>
                    <executions>
                        <execution>
                            <id>default-copy-resources</id>
                            <phase>process-resources</phase>
                            <goals>
                                <goal>copy-resources</goal>
                            </goals>
                            <configuration>
                                <overwrite>true</overwrite>
                                <!-- This folder is the folder where your angular files 
                                will be copied to. It must match the resulting war-file name.
                                So if you have customized the name of war-file for ex. as "app.war"
                                then below value should be ${project.build.directory}/app/ 
                                Value given below is as per default war-file name -->
                                <outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}/</outputDirectory>
                                <resources>
                                    <resource>
                                        <directory>${project.basedir}/${angular.project.location}/dist</directory>
                                    </resource>
                                </resources>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <configuration>
                <failOnMissingWebXml>false</failOnMissingWebXml>
        <!--         <attachClasses>true</attachClasses>
                <webXml>target/web.xml</webXml>
                <webResources>
                    <resource>
                        <directory>src/main/webapp</directory>
                        <filtering>true</filtering>
                    </resource>
                </webResources> -->
            </configuration>
        </plugin>

                    <plugin>
                        <artifactId>maven-compiler-plugin</artifactId>
                        <version>3.1</version>
                        <configuration>
                            <fork>true</fork>
                            <executable>C:\Program Files\Java\jdk1.8.0_181\bin\javac.exe</executable>

<!--make sure above directory is correct (make it same as your local javac.exe-->
                        </configuration>
                    </plugin>
            </plugins>
        </build>



        </project>

5. right click your maven project maven - maven install or terminal : mvn clean install 5.右键单击您的maven项目maven - maven install或terminal:mvn clean install

and wait until it stalled. 并等到它停滞不前。 once it installed, you can see node-installation folder and war file are created 安装完成后,可以看到创建了node-installation文件夹和war文件 在此输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM