Kaustubh Khare
Kaustubh Khare

Reputation: 3510

Deploy spring-boot and angular 7 application using war into tomcat 8.5

I am trying to deploy the Angular 7 + Spring Boot application using war into tomcat. I have followed some steps to create war with angular code. War is created successfully with UI code. But I am not able to call UI code. When I trying to call

it shows 404.

Web services are working properly. I can able to call them.

How I can call index.html of my application?

Note:- I am not using spring-boot-starter-web

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hackthon</groupId>
    <artifactId>pmoconnect</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>pmoconnect</name>
    <description>PMO Connect</description>
    <packaging>war</packaging>
    <properties>
        <java.version>1.8</java.version>
        <start-class>com.hackthon.HackthonApplication</start-class>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jersey</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!-- excel 2007 over -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.5.5</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-envers</artifactId>
            <version>${hibernate.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.github.eirslett</groupId>
                <artifactId>frontend-maven-plugin</artifactId>
                <version>1.3</version>

                <configuration>
                    <nodeVersion>v8.11.3</nodeVersion>
                    <npmVersion>6.3.0</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</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>

            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/classes/static/</outputDirectory>
                            <!-- <outputDirectory>${project.build.directory}/../src/main/resources/static/</outputDirectory> -->
                            <resources>
                                <resource>
                                    <directory>/src/main/ngapp/dist/</directory>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-failsafe-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <configuration>
                    <packagingExcludes>WEB-INF/lib/tomcat-*.jar</packagingExcludes>
                    <warName>pmoconnect</warName>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

application.properties

spring.datasource.url = jdbc:mysql://localhost:3306/elite_db?allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username = <username>
spring.datasource.password = <password>


## Hibernate Properties
# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update
org.hibernate.envers.audit_table_suffix = _AUDIT_LOG

HackthonApplication.java

@SpringBootApplication
@ComponentScan
public class HackthonApplication {
    public static void main(String[] args) {
        SpringApplication.run(HackthonApplication.class, args);
    }
}

index.html

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>PMO Connect</title>
  <base href="./">

  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" type="image/x-icon" href="favicon.ico">
  <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
 <body>
  <app-root></app-root>
  <script type="text/javascript" src="runtime.js"></script>
  <script type="text/javascript" src="es2015-polyfills.js" nomodule></script>
  <script type="text/javascript" src="polyfills.js"></script>
  <script type="text/javascript" src="styles.js"></script>
  <script type="text/javascript" src="vendor.js"></script>
  <script type="text/javascript" src="main.js"></script>
  </body>
</html>

war file

war file

tomcat logs

2019-03-27 10:34:19.134  INFO 18464 --- [ost-startStop-2] com.hackthon.HackthonApplication         : No active profile set, falling back to default profiles: default
    2019-03-27 10:34:19.291  INFO 18464 --- [ost-startStop-2] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
    2019-03-27 10:34:22.558  INFO 18464 --- [ost-startStop-2] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
    2019-03-27 10:34:22.977  INFO 18464 --- [ost-startStop-2] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 372ms. Found 6 repository interfaces.
    2019-03-27 10:34:24.386  INFO 18464 --- [ost-startStop-2] o.a.c.c.C.[.[localhost].[/pmoconnect]    : Initializing Spring embedded WebApplicationContext
    2019-03-27 10:34:24.386  INFO 18464 --- [ost-startStop-2] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 5094 ms
    2019-03-27 10:34:24.809  INFO 18464 --- [ost-startStop-2] o.s.b.a.jersey.JerseyAutoConfiguration   : Configuring existing registration for Jersey servlet 'com.hackthon.config.JerseyConfiguration'
    2019-03-27 10:34:25.046  INFO 18464 --- [ost-startStop-2] o.s.boot.web.servlet.RegistrationBean    : Servlet com.hackthon.config.JerseyConfiguration was not registered (possibly already registered?)
    2019-03-27 10:34:25.628  INFO 18464 --- [ost-startStop-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
    2019-03-27 10:34:26.473  INFO 18464 --- [ost-startStop-2] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
    2019-03-27 10:34:26.815  INFO 18464 --- [ost-startStop-2] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
        name: default
        ...]
    2019-03-27 10:34:27.465  INFO 18464 --- [ost-startStop-2] org.hibernate.Version                    : HHH000412: Hibernate Core {5.3.7.Final}
    2019-03-27 10:34:27.472  INFO 18464 --- [ost-startStop-2] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
    2019-03-27 10:34:28.996  INFO 18464 --- [ost-startStop-2] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.4.Final}
    2019-03-27 10:34:30.597  INFO 18464 --- [ost-startStop-2] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    2019-03-27 10:34:30.951  INFO 18464 --- [ost-startStop-2] o.h.e.boot.internal.EnversServiceImpl    : Envers integration enabled? : true
    2019-03-27 10:34:41.272  INFO 18464 --- [ost-startStop-2] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
    2019-03-27 10:34:43.158  INFO 18464 --- [ost-startStop-2] o.h.h.i.QueryTranslatorFactoryInitiator  : HHH000397: Using ASTQueryTranslatorFactory
    2019-03-27 10:34:46.554  INFO 18464 --- [ost-startStop-2] com.hackthon.HackthonApplication         : Started HackthonApplication in 29.239 seconds (JVM running for 143.14)
    2019-03-27 10:34:46.944  INFO 18464 --- [ost-startStop-2] org.apache.jasper.servlet.TldScanner     : At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
    2019-03-27 10:34:50.219  WARN 18464 --- [ost-startStop-2] org.glassfish.jersey.internal.Errors     : The following warnings have been detected: WARNING: A HTTP GET method, public javax.ws.rs.core.Response com.hackthon.service.WSFGMapping.getMappings(java.lang.String), should not consume any entity.

    2019-03-27 10:34:50.348  INFO 18464 --- [ost-startStop-2] org.apache.catalina.startup.HostConfig   : Deployment of web application archive [C:\Users\kaukhare\myWorkspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\webapps\pmoconnect.war] has finished in [68,229] ms

Upvotes: 4

Views: 5783

Answers (5)

Grace De Paz
Grace De Paz

Reputation: 51

<execution>
                    <id>copy-standalone-index</id>
                    <phase>process-resources</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <overwrite>true</overwrite>
                        <outputDirectory>${project.build.directory}/${project.artifactId}-${project.version}/</outputDirectory>
                        <resources>
                            <resource>
                                <directory>${project.basedir}/src/main/webapp/src/</directory>
                                <includes>index.html</includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>

Upvotes: 0

Saad Joudi
Saad Joudi

Reputation: 623

In your POM.xml, Change your directory Path by adding the name of your Angular Application.

<resource>
    <directory> /src/main/ngapp/dist/NAME_APP </directory>
</resource>

Upvotes: 0

Kaustubh Khare
Kaustubh Khare

Reputation: 3510

I have not found any solution to the problem using spring-jersey. So I have decided to use spring-web.

Required changes I have made to project,

pom.xml

Remove spring-jersey and add spring-web,

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

package.json

"start": "ng serve --proxy-config proxy.conf.json",
"build": "ng build --base-href=\"./\"",

Add proxy.conf.json file into base path of angular app,

{
  "/api": {
    "target": "http://localhost:8080",
    "secure": false
  }
}

HackthonApplication.java

public class HackthonApplication extends SpringBootServletInitializer{

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(HackthonApplication.class);
    }
}

And there are some annotations changes for webservice. This is because i have changed spring-jersey to spring-web.

Upvotes: 1

Mikita Berazouski
Mikita Berazouski

Reputation: 1001

Kaustubh,

Looks like you forgot to extend your application from SpringBootServletInitializer. More about that you can read in official documentation. Long story short please try following code for your main class.

@SpringBootApplication
@ComponentScan
public class HackthonApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(HackthonApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(HackthonApplication.class);
    }
}

Hope this will solve your issue.

Upvotes: 1

Ganesh Gudghe
Ganesh Gudghe

Reputation: 1387

I also had the same issue and I resolved by adding following script inside index.html

<base href="/" id="baseHref">
<script>
  (function() {
    document.getElementById('baseHref').href = '/' + window.location.pathname.split('/')[1] + "/";
  })();
</script>

I think it will solve your problem.

Upvotes: 1

Related Questions