Wednesday, June 7, 2017

SpringBoot: running a multi module project

Leave a Comment

I have a basic SpringBoot app. using Spring Initializer, embedded Tomcat, Thymeleaf template engine, and package as an executable JAR file. is a multi-module project with Spring Boot, the project will have 3 modules. Here the parent 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">     <modelVersion>4.0.0</modelVersion>      <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>1.5.3.RELEASE</version>         <relativePath /> <!-- lookup parent from repository -->     </parent>      <groupId>com.tdkcloud</groupId>     <artifactId>tdk-cloud</artifactId>     <version>0.0.2-SNAPSHOT</version>     <packaging>pom</packaging>      <modules>            <module>tdk-core</module>         <module>tdk-batch</module>         <module>tdk-web</module>     </modules>       <dependencies>         <!-- Spring Boot dependencies -->         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-data-jpa</artifactId>         </dependency>          <!-- Test dependencies -->         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-test</artifactId>             <scope>test</scope>         </dependency>         <dependency>             <groupId>uk.co.jemos.podam</groupId>             <artifactId>podam</artifactId>             <version>7.0.5.RELEASE</version>             <scope>test</scope>         </dependency>           <!-- Logging dependencies -->         <dependency>             <groupId>ch.qos.logback</groupId>             <artifactId>logback-classic</artifactId>         </dependency>          <!-- Email dependencies -->         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-mail</artifactId>         </dependency>          <!-- Security dependencies -->         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-security</artifactId>         </dependency>          <!-- Spring data -->         <dependency>             <groupId>com.h2database</groupId>             <artifactId>h2</artifactId>         </dependency>        </dependencies>  </project> 

Here the module core

<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">    <modelVersion>4.0.0</modelVersion>      <parent>         <groupId>com.tdkcloud</groupId>         <artifactId>tdk-cloud</artifactId>         <version>0.0.2-SNAPSHOT</version>     </parent>     <groupId>com.tdkcloud.core</groupId>   <artifactId>tdk-core</artifactId>    <packaging>jar</packaging>          <properties>     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     <java.version>1.8</java.version>   </properties>    <dependencies>           <!--  Hibernate dependencies -->         <dependency>             <groupId>org.hibernate</groupId>             <artifactId>hibernate-validator</artifactId>         </dependency>          <dependency>             <groupId>com.googlecode.libphonenumber</groupId>             <artifactId>libphonenumber</artifactId>             <version>8.4.3</version>         </dependency>          <dependency>             <groupId>commons-codec</groupId>             <artifactId>commons-codec</artifactId>             <!-- <version>1.10</version> -->         </dependency>          <dependency>             <groupId>com.fasterxml.jackson.core</groupId>             <artifactId>jackson-core</artifactId>             <!-- <version>2.9.0.pr3</version> -->         </dependency>          <dependency>             <groupId>com.fasterxml.jackson.core</groupId>             <artifactId>jackson-annotations</artifactId>             <!-- <version>2.9.0.pr3</version> -->         </dependency>          <dependency>             <groupId>com.fasterxml.jackson.core</groupId>             <artifactId>jackson-databind</artifactId>                </dependency>          <dependency>       <groupId>org.codehaus.jackson</groupId>       <artifactId>jackson-mapper-asl</artifactId>       <version>1.9.9</version> </dependency>       </dependencies>  </project> 

and here the module web:

<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">    <modelVersion>4.0.0</modelVersion>      <parent>         <groupId>com.tdkcloud</groupId>         <artifactId>tdk-cloud</artifactId>         <version>0.0.2-SNAPSHOT</version>     </parent>    <groupId>com.tdkcloud.web</groupId>   <artifactId>tdk-web</artifactId>   <packaging>jar</packaging>     <properties>     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     <java.version>1.8</java.version>     <start-class>com.tdkcloud.TdkCloudApplication</start-class>   </properties>    <dependencies>          <!-- tdk-core dependencies -->          <dependency>             <groupId>com.tdkcloud.core</groupId>             <artifactId>tdk-core</artifactId>             <version>0.0.2-SNAPSHOT</version>                    </dependency>           <dependency>              <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </dependency>          <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-thymeleaf</artifactId>         </dependency>           <!-- Webjars for JQuery and Bootstrap -->         <dependency>             <groupId>org.webjars</groupId>             <artifactId>bootstrap</artifactId>             <version>3.3.7-1</version>         </dependency>          <dependency>             <groupId>org.webjars</groupId>             <artifactId>jquery</artifactId>             <version>3.2.0</version>         </dependency>          <!-- Spring Security -->         <dependency>             <groupId>org.thymeleaf.extras</groupId>             <artifactId>thymeleaf-extras-springsecurity4</artifactId>             <!-- <version>3.0.2.RELEASE</version> -->         </dependency>      </dependencies>      <build>         <plugins>             <plugin>                 <groupId>org.apache.maven.plugins</groupId>                 <artifactId>maven-jar-plugin</artifactId>                 <configuration>                     <archive>                         <manifest>                             <mainClass>com.tdkcloud.TdkCloudApplication</mainClass>                         </manifest>                     </archive>                 </configuration>             </plugin>             <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>             </plugin>         </plugins>     </build>         <!--  <build>         <plugins>             <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>             </plugin>         </plugins>     </build>  -->   </project> 

from the parent root I generate all the modules using:

mvn clean package 

But the problem is that the tdk-web-0.0.2-SNAPSHOT.jar does not contain the tdk-core-0.0.2-SNAPSHOT.jar and then it fails on the startup

Here the maven result:

MacBook-Pro-de-nunito:tdk-cloud calzada$ mvn clean package -Dmaven.test.skip=true [INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO]  [INFO] tdk-cloud [INFO] tdk-core [INFO] tdk-batch [INFO] tdk-web [INFO]                                                                          [INFO] ------------------------------------------------------------------------ [INFO] Building tdk-cloud 0.0.2-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO]  [INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ tdk-cloud --- [INFO]                                                                          [INFO] ------------------------------------------------------------------------ [INFO] Building tdk-core 0.0.2-SNAPSHOT [INFO] ------------------------------------------------------------------------ [WARNING] The POM for com.h2database:h2:jar:1.4.194 is missing, no dependency information available [INFO]  [INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ tdk-core --- [INFO] Deleting /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-core/target [INFO]  [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ tdk-core --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 1 resource [INFO] Copying 1 resource [INFO]  [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ tdk-core --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 52 source files to /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-core/target/classes [INFO]  [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ tdk-core --- [INFO] Not copying test resources [INFO]  [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ tdk-core --- [INFO] Not compiling test sources [INFO]  [INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ tdk-core --- [INFO] Tests are skipped. [INFO]  [INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ tdk-core --- [INFO] Building jar: /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-core/target/tdk-core-0.0.2-SNAPSHOT.jar [INFO]                                                                          [INFO] ------------------------------------------------------------------------ [INFO] Building tdk-batch 0.0.2-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO]  [INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ tdk-batch --- [INFO] Deleting /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-batch/target [INFO]  [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ tdk-batch --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-batch/src/main/resources [INFO] skip non existing resourceDirectory /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-batch/src/main/resources [INFO]  [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ tdk-batch --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-batch/target/classes [INFO]  [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ tdk-batch --- [INFO] Not copying test resources [INFO]  [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ tdk-batch --- [INFO] Not compiling test sources [INFO]  [INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ tdk-batch --- [INFO] Tests are skipped. [INFO]  [INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ tdk-batch --- [INFO] Building jar: /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-batch/target/tdk-batch-0.0.2-SNAPSHOT.jar [INFO]                                                                          [INFO] ------------------------------------------------------------------------ [INFO] Building tdk-web 0.0.2-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO]  [INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ tdk-web --- [INFO] Deleting /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-web/target [INFO]  [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ tdk-web --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 0 resource [INFO] Copying 339 resources [INFO]  [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ tdk-web --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 25 source files to /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-web/target/classes [INFO]  [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ tdk-web --- [INFO] Not copying test resources [INFO]  [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ tdk-web --- [INFO] Not compiling test sources [INFO]  [INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ tdk-web --- [INFO] Tests are skipped. [INFO]  [INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ tdk-web --- [INFO] Building jar: /Users/calzada/Development/J2EE/workspace-sts-3.8.4.RELEASE/tdk-cloud/tdk-web/target/tdk-web-0.0.2-SNAPSHOT.jar [INFO]  [INFO] --- spring-boot-maven-plugin:1.5.3.RELEASE:repackage (default) @ tdk-web --- [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO]  [INFO] tdk-cloud ....................................... SUCCESS [  0.105 s] [INFO] tdk-core ........................................ SUCCESS [  1.634 s] [INFO] tdk-batch ....................................... SUCCESS [  0.114 s] [INFO] tdk-web ......................................... SUCCESS [  1.506 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3.663 s [INFO] Finished at: 2017-05-30T05:37:04+02:00 [INFO] Final Memory: 47M/539M [INFO] ------------------------------------------------------------------------ MacBook-Pro-de-nunito:tdk-cloud calzada$  

This is the error I got:

*************************** APPLICATION FAILED TO START ***************************  Description:  Field emailService in com.tdkcloud.web.controllers.AppErrorController required a bean of type 'com.tdkcloud.backend.service.EmailService' that could not be found.   Action:  Consider defining a bean of type 'com.tdkcloud.backend.service.EmailService' in your configuration. 

I unzipped the jar and there is no class of the core module

adding the proposed code to the module web:

<plugin>                     <artifactId>maven-dependency-plugin</artifactId>                     <executions>                         <execution>                             <phase>install</phase>                             <goals>                                 <goal>copy-dependencies</goal>                             </goals>                             <configuration>                                 <outputDirectory>${project.build.directory}/lib</outputDirectory>                             </configuration>                         </execution>                     </executions>                 </plugin> 

I have the next error: Error resolving template "/tdk/login/login", template might not exist or might not be accessible by any of the configured Template Reso

but the template is there: enter image description here

5 Answers

Answers 1

I think your @ComponentScan annotation is missing, or maybe wrong. (e.g.: @ComponentScan({"com.tdkcloud.web"}) will not find services in com.tdkcloud.backend package). Or maybe @Service annotation is missing from your EmailService.

So to solve this, your code need to look something like this:

App.java (or Webconfig.java)

@Configuration @EnableWebMvc @ComponentScan({"com.tdkcloud"}) @SpringBootApplication public class App {    ... } 

EmailService.java

public interface EmailService {    ... } 

EmailServiceImpl.java

@Service public class EmailServiceImpl {    ... } 

Answers 2

you are missing version in core module. try adding the following core module pom

<version>0.0.2-SNAPSHOT</version> 

so it becomes.

<groupId>com.tdkcloud.core</groupId> <artifactId>tdk-core</artifactId> <packaging>jar</packaging>  <version>0.0.2-SNAPSHOT</version>  

Answers 3

Try to add this.

        <plugin>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-maven-plugin</artifactId>             <executions>                 <execution>                     <goals>                         <goal>repackage</goal>                     </goals>                     <configuration>                         <classifier>exec</classifier>                     </configuration>                 </execution>             </executions>         </plugin> 

Repackages existing JAR and WAR archives so that they can be executed from the command line using java -jar. With layout=NONE can also be used simply to package a JAR with nested dependencies (and no main class, so not executable).

Got from this

Answers 4

I was facing the same issue earlier. I am guessing you are not running the jar in the exploded form. You probably need this plugin to pull the jars inside the bundle and execute the .original jar.

               <plugin>                     <artifactId>maven-dependency-plugin</artifactId>                     <executions>                         <execution>                             <phase>install</phase>                             <goals>                                 <goal>copy-dependencies</goal>                             </goals>                             <configuration>                                 <outputDirectory>${project.build.directory}/lib</outputDirectory>                             </configuration>                         </execution>                     </executions>                 </plugin> 

This would bundle all the dependencies you have defined in your pom inside the jar. Hope this helps.

Answers 5

            <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>                 <configuration>                     <executable>true</executable>                 </configuration>                 <executions>                     <execution>                         <goals>                             <goal>repackage</goal>                         </goals>                     </execution>                 </executions>             </plugin> 

I suggest this for creating a executable Jar.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment