Code Master
Code Master

Reputation: 39

How to make single war file of Spring Boot multimodule project

my main root pom and also web module pom and model module pom is there so How to make single war file instead of multiple war file of each module.Or any ather way to make war file from these jars generated and war file contain application.properties and WEB-INF and META-INF folder with lib folder

Main 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <modules>
        <module>web</module>
        <module>model</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.codemaster</groupId>
    <artifactId>college-management-system</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>college-management-system</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>13</java.version>
    </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-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>



</project>

web module 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">
    <parent>
        <artifactId>college-management-system</artifactId>
        <groupId>com.codemaster</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>web</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>com.codemaster</groupId>
            <artifactId>model</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

</project>

model module 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">
    <parent>
        <artifactId>college-management-system</artifactId>
        <groupId>com.codemaster</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>model</artifactId>
    <packaging>jar</packaging>

</project>

so how to make only single war file instead of multiple war files of each module

Upvotes: 3

Views: 2695

Answers (4)

sedrakpc
sedrakpc

Reputation: 564

In your case short answer is you need to change the packaging in your web module pom.xml from jar to war

<packaging>war</packaging>

Detailed answer is: you need you parent .pom to describe all the modules and all you have to do is specify packaging for each module and add them as dependencies into your WEB module. Here are parent, web and one module(core) pom file as an example:

parent.pom

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

    <groupId>com.example</groupId>
    <artifactId>demo-project</artifactId>
    <version>3.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>core</module>
        <module>web</module>
        <module>api</module>
    </modules>
</project>

core.pom

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

    <groupId>com.example</groupId>
    <artifactId>demo-project-core</artifactId>
    <version>3.0</version>
    <packaging>jar</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.11</java.version>
    </properties>

    <dependencies>
    </dependencies>
    <build>
    </build>
</project>

web.pom

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

    <groupId>com.example</groupId>
    <artifactId>demo-project-web</artifactId>
    <version>3.0</version>
    <packaging>war</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath /> 
    </parent>

    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>demo-project-core</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>demo-project-api</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</project>

Upvotes: 0

noodleman
noodleman

Reputation: 1

Maybe.... java ~~.war with classpath inclues ~~.jar files

Upvotes: 0

Naresh Kumar
Naresh Kumar

Reputation: 814

In your case you added packaging as a jar in web module(pom.xml), change web module packaging as a war.

Old Code

<packaging>jar</packaging>

New code

<packaging>war</packaging>

Please follow the below spring boot maven multi module project guidelines for more details

Spring Official documentation
https://spring.io/guides/gs/multi-module/

Git hub spring boot maven multi module example
https://github.com/spring-guides/gs-multi-module.git

Upvotes: 0

Ashish Bakwad
Ashish Bakwad

Reputation: 811

Your multi-module project structure and POM should be like this

Parent - pom.xml -> Packaging pom

Module1 - pom.xml -> Packaging jar

Module2 - pom.xml -> Packaging jar

Web - pom.xml -> Packaging war

Parent POM

<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.2.0.RELEASE</version>
   <relativePath /> <!-- lookup parent from repository -->
  </parent>
  <groupId>com.example</groupId>
  <artifactId>application-base</artifactId>
  <version>1.0.0</version>
  <packaging>pom</packaging>
  <properties>
    <java.version>1.8</java.version>
  </properties>
  <modules>
   <module>module1</module>
   <module>module2</module>
   <module>web</module>
  </modules>
  <dependencies>
            ----
  </dependencies>
</project>

Module POM

<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>com.example</groupId>
     <artifactId>application-base</artifactId>
     <version>1.0.0</version>
    </parent>
     <packaging>jar</packaging>
     <artifactId>module</artifactId>
     <name>Module</name>
     <description>/description>
    <dependencies>
      ------
    </dependencies>
</project>

Web POM

<?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>com.example</groupId>
   <artifactId>application-base</artifactId>
   <version>1.0.0</version>
   </parent>
   <artifactId>web</artifactId>
   <name>web</name>
   <packaging>war</packaging>
   <description></description>
   <dependencies>
    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
     <groupId>com.example</groupId>
     <artifactId>module</artifactId>
     <version>1.0.0</version>
    </dependency>
   </dependencies>
   <build>
    <plugins>   
    </plugins>
   </build>
</project>

Upvotes: 1

Related Questions