Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to find a suitable main class, please add a 'mainClass' property, Spring boot

Tags:

java

spring

maven

Hi friends i am developing a spring boot maven based project and and i have created a maven submodules but when i try to run my project it gives an error

[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.2.5.RELEASE:run (default-cli) on project demo-jhipster: Unable to find a suitable main class, please add a 'mainClass' property -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.2.5.RELEASE:run (default-cli) on project demo-jhipster: Unable to find a suitable main class, please add a 'mainClass' property         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)         at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)         at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)         at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)         at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)         at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)         at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355)         at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)         at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)         at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216)         at org.apache.maven.cli.MavenCli.main(MavenCli.java:160) 

my parent pom and child pom is

<?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/maven-v4_0_0.xsd">     <modelVersion>4.0.0</modelVersion>      <parent>         <artifactId>spring-boot-starter-parent</artifactId>         <groupId>org.springframework.boot</groupId>         <version>1.2.5.RELEASE</version>         <relativePath />     </parent>      <groupId>com.aquevix.demo</groupId>     <artifactId>demo-jhipster</artifactId>     <version>0.0.1-SNAPSHOT</version>     <packaging>pom</packaging>      <name>demo_jhipster</name>      <prerequisites>         <maven>3.0.0</maven>     </prerequisites>     <modules>         <module>JhipsterSubmodule</module>     </modules>      <properties>         <assertj-core.version>3.1.0</assertj-core.version>         <awaitility.version>1.4.0</awaitility.version>         <commons-io.version>2.4</commons-io.version>         <commons-lang.version>2.6</commons-lang.version>         <gatling-maven-plugin.version>2.1.6</gatling-maven-plugin.version>         <gatling.version>2.1.6</gatling.version>         <hibernate.version>4.3.10.Final</hibernate.version>         <hikaricp.version>2.4.0</hikaricp.version>         <jacoco-maven-plugin.version>0.7.4.201502262128</jacoco-maven-plugin.version>         <java.version>1.8</java.version>         <javax.inject.version>1</javax.inject.version>         <joda-time-hibernate.version>1.4</joda-time-hibernate.version>         <liquibase-hibernate4.version>3.5</liquibase-hibernate4.version>         <liquibase-slf4j.version>1.2.1</liquibase-slf4j.version>         <liquibase.version>3.4.1</liquibase.version>         <mapstruct.version>1.0.0.CR1</mapstruct.version>         <maven-enforcer-plugin.version>1.3.1</maven-enforcer-plugin.version>         <maven-sortpom-plugin.version>2.3.0</maven-sortpom-plugin.version>         <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>         <maven.compiler.source>${java.version}</maven.compiler.source>         <maven.compiler.target>${java.version}</maven.compiler.target>         <metrics-spark-reporter.version>1.2</metrics-spark-reporter.version>         <metrics-spring.version>3.1.2</metrics-spring.version>         <!-- Sonar properties -->         <project.testresult.directory>${project.build.directory}/test-results</project.testresult.directory>         <run.addResources>false</run.addResources>         <sonar-maven-plugin.version>2.6</sonar-maven-plugin.version>         <sonar.exclusions>src/main/webapp/assets/**/*.*, src/main/webapp/bower_components/**/*.*, src/main/webapp/dist/**/*.*</sonar.exclusions>         <sonar.jacoco.itReportPath>${project.testresult.directory}/coverage/jacoco/jacoco-it.exec</sonar.jacoco.itReportPath>         <sonar.jacoco.reportPath>${project.testresult.directory}/coverage/jacoco/jacoco.exec</sonar.jacoco.reportPath>         <sonar.java.codeCoveragePlugin>jacoco</sonar.java.codeCoveragePlugin>          <sonar.javascript.jstestdriver.reportsPath>${project.testresult.directory}/karma</sonar.javascript.jstestdriver.reportsPath>         <sonar.javascript.lcov.reportPath>${project.testresult.directory}/coverage/report-lcov/lcov.info</sonar.javascript.lcov.reportPath>          <sonar.sources>${project.basedir}/src/main/</sonar.sources>         <sonar.surefire.reportsPath>${project.testresult.directory}/surefire-reports</sonar.surefire.reportsPath>         <sonar.tests>${project.basedir}/src/test/</sonar.tests>         <spring-security.version>4.0.2.RELEASE</spring-security.version>         <springfox.version>2.0.3</springfox.version>         <usertype-core.version>4.0.0.GA</usertype-core.version>      </properties>      <dependencies>         // dependencies..     </dependencies>     <build>         <resources>             <resource>                 <filtering>true</filtering>                 <directory>src/main/resources</directory>                 <includes>                     <include>**/*.xml</include>                 </includes>             </resource>             <resource>                 <filtering>false</filtering>                 <directory>src/main/resources</directory>                 <excludes>                     <exclude>**/*.xml</exclude>                 </excludes>             </resource>         </resources>         <plugins>             <plugin>                 <groupId>com.google.code.sortpom</groupId>                 <artifactId>maven-sortpom-plugin</artifactId>                 <version>${maven-sortpom-plugin.version}</version>                 <executions>                     <execution>                         <phase>verify</phase>                         <goals>                             <goal>sort</goal>                         </goals>                     </execution>                 </executions>                 <configuration>                     <sortProperties>true</sortProperties>                     <nrOfIndentSpace>4</nrOfIndentSpace>                     <sortDependencies>groupId,artifactId</sortDependencies>                     <sortPlugins>groupId,artifactId</sortPlugins>                     <keepBlankLines>true</keepBlankLines>                     <expandEmptyElements>false</expandEmptyElements>                 </configuration>             </plugin>             <plugin>                 <groupId>io.gatling</groupId>                 <artifactId>gatling-maven-plugin</artifactId>                 <version>${gatling-maven-plugin.version}</version>                 <configuration>                     <configFolder>src/test/gatling/conf</configFolder>                     <dataFolder>src/test/gatling/data</dataFolder>                     <resultsFolder>target/gatling/results</resultsFolder>                     <bodiesFolder>src/test/gatling/bodies</bodiesFolder>                     <simulationsFolder>src/test/gatling/simulations</simulationsFolder>                     <!-- This will force Gatling to ask which simulation to run                       This is useful when you have multiple simulations -->                     <simulationClass>*</simulationClass>                 </configuration>             </plugin>             <plugin>                 <groupId>org.apache.maven.plugins</groupId>                 <artifactId>maven-eclipse-plugin</artifactId>                 <configuration>                     <downloadSources>true</downloadSources>                     <downloadJavadocs>true</downloadJavadocs>                 </configuration>             </plugin>             <plugin>                 <groupId>org.apache.maven.plugins</groupId>                 <artifactId>maven-enforcer-plugin</artifactId>                 <version>${maven-enforcer-plugin.version}</version>                 <executions>                     <execution>                         <id>enforce-versions</id>                         <goals>                             <goal>enforce</goal>                         </goals>                     </execution>                 </executions>                 <configuration>                     <rules>                         <requireMavenVersion>                             <message>You are running an older version of Maven. JHipster requires at least Maven 3.0</message>                             <version>[3.0.0,)</version>                         </requireMavenVersion>                         <requireJavaVersion>                             <message>You are running an older version of Java. JHipster requires at least JDK ${java.version}</message>                             <version>[${java.version}.0,)</version>                         </requireJavaVersion>                     </rules>                 </configuration>             </plugin>             <plugin>                 <groupId>org.apache.maven.plugins</groupId>                 <artifactId>maven-surefire-plugin</artifactId>                 <configuration>                     <argLine>-Xmx256m ${surefireArgLine}</argLine>                     <!-- Force alphabetical order to have a reproducible build -->                     <runOrder>alphabetical</runOrder>                 </configuration>             </plugin>             <plugin>                 <groupId>org.apache.maven.plugins</groupId>                 <artifactId>maven-war-plugin</artifactId>                 <configuration>                     <packagingExcludes>WEB-INF/lib/tomcat-*.jar</packagingExcludes>                 </configuration>             </plugin>             <plugin>                 <groupId>org.bsc.maven</groupId>                 <artifactId>maven-processor-plugin</artifactId>                 <version>2.2.4</version>                 <executions>                     <execution>                         <id>process</id>                         <phase>generate-sources</phase>                         <goals>                             <goal>process</goal>                         </goals>                     </execution>                 </executions>                 <dependencies>                     <dependency>                         <groupId>org.mapstruct</groupId>                         <artifactId>mapstruct-processor</artifactId>                         <version>${mapstruct.version}</version>                     </dependency>                 </dependencies>                 <configuration>                     <defaultOutputDirectory>${project.build.directory}/generated-sources</defaultOutputDirectory>                     <processors>                         <processor>org.mapstruct.ap.MappingProcessor</processor>                     </processors>                     <options>                         <mapstruct.suppressGeneratorTimestamp>true</mapstruct.suppressGeneratorTimestamp>                         <mapstruct.defaultComponentModel>spring</mapstruct.defaultComponentModel>                     </options>                 </configuration>             </plugin>             <plugin>                 <groupId>org.codehaus.mojo</groupId>                 <artifactId>sonar-maven-plugin</artifactId>                 <version>${sonar-maven-plugin.version}</version>             </plugin>             <plugin>                 <groupId>org.jacoco</groupId>                 <artifactId>jacoco-maven-plugin</artifactId>                 <version>${jacoco-maven-plugin.version}</version>                 <executions>                     <execution>                         <id>pre-unit-tests</id>                         <goals>                             <goal>prepare-agent</goal>                         </goals>                         <configuration>                             <!-- Sets the path to the file which contains the execution data. -->                             <destFile>${project.testresult.directory}/coverage/jacoco/jacoco.exec</destFile>                             <!-- Sets the name of the property containing the settings for JaCoCo runtime agent. -->                             <propertyName>surefireArgLine</propertyName>                         </configuration>                     </execution>                     <!-- Ensures that the code coverage report for unit tests is created after unit tests have been run -->                     <execution>                         <id>post-unit-test</id>                         <phase>test</phase>                         <goals>                             <goal>report</goal>                         </goals>                         <configuration>                             <dataFile>${project.testresult.directory}/coverage/jacoco/jacoco.exec</dataFile>                             <outputDirectory>${project.testresult.directory}/coverage/jacoco</outputDirectory>                         </configuration>                     </execution>                 </executions>             </plugin>             <plugin>                 <groupId>org.liquibase</groupId>                 <artifactId>liquibase-maven-plugin</artifactId>                 <version>${liquibase.version}</version>                 <dependencies>                     <dependency>                         <groupId>org.javassist</groupId>                         <artifactId>javassist</artifactId>                         <version>3.18.2-GA</version>                     </dependency>                     <dependency>                         <groupId>org.liquibase.ext</groupId>                         <artifactId>liquibase-hibernate4</artifactId>                         <version>${liquibase-hibernate4.version}</version>                     </dependency>                     <dependency>                         <groupId>org.springframework.boot</groupId>                         <artifactId>spring-boot-starter-data-jpa</artifactId>                         <version>${project.parent.version}</version>                     </dependency>                 </dependencies>                 <configuration>                     <changeLogFile>src/main/resources/config/liquibase/master.xml</changeLogFile>                     <diffChangeLogFile>src/main/resources/config/liquibase/changelog/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>                     <driver />                     <url />                     <defaultSchemaName />                     <username />                     <password />                     <referenceUrl>hibernate:spring:com.aquevix.demo.domain?dialect=</referenceUrl>                     <verbose>true</verbose>                     <logging>debug</logging>                 </configuration>             </plugin>             <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>                 <configuration>                     <jvmArguments>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005</jvmArguments>                     <arguments>                         <argument>--spring.profiles.active=dev</argument>                     </arguments>                 </configuration>             </plugin>         </plugins>     </build>      <profiles>         <profile>             <id>dev</id>             <activation>                 <activeByDefault>true</activeByDefault>             </activation>             <properties>                 <!-- log configuration -->                 <logback.loglevel>DEBUG</logback.loglevel>             </properties>             <dependencies>                 <dependency>                     <groupId>org.springframework.boot</groupId>                     <artifactId>spring-boot-starter-tomcat</artifactId>                 </dependency>             </dependencies>         </profile>         <profile>             <id>fast</id>             <build>                 <plugins>                     <plugin>                         <groupId>org.springframework.boot</groupId>                         <artifactId>spring-boot-maven-plugin</artifactId>                         <configuration>                             <arguments>                                 <argument>--spring.profiles.active=dev,fast</argument>                             </arguments>                         </configuration>                     </plugin>                 </plugins>             </build>             <properties>                 <!-- log configuration -->                 <logback.loglevel>DEBUG</logback.loglevel>             </properties>             <dependencies>                 <dependency>                     <groupId>org.springframework.boot</groupId>                     <artifactId>spring-boot-starter-undertow</artifactId>                 </dependency>             </dependencies>         </profile>         <profile>             <id>prod</id>             <build>                 <plugins>                     <plugin>                         <groupId>com.github.trecloux</groupId>                         <artifactId>yeoman-maven-plugin</artifactId>                         <version>0.4</version>                         <executions>                             <execution>                                 <id>run-frontend-build</id>                                 <phase>generate-resources</phase>                                 <goals>                                     <goal>build</goal>                                 </goals>                                 <configuration>                                     <buildTool>grunt</buildTool>                                     <buildArgs>build --force --no-color</buildArgs>                                 </configuration>                             </execution>                         </executions>                         <configuration>                             <yeomanProjectDirectory>${project.basedir}</yeomanProjectDirectory>                         </configuration>                     </plugin>                     <plugin>                         <artifactId>maven-clean-plugin</artifactId>                         <version>2.5</version>                         <configuration>                             <filesets>                                 <fileset>                                       <directory>src/main/webapp/dist</directory>                                 </fileset>                                 <fileset>                                     <directory>.tmp</directory>                                 </fileset>                                 <fileset>                                     <directory>node_modules</directory>                                 </fileset>                             </filesets>                         </configuration>                     </plugin>                     <plugin>                         <groupId>org.springframework.boot</groupId>                         <artifactId>spring-boot-maven-plugin</artifactId>                         <configuration>                             <arguments>                                 <argument>--spring.profiles.active=prod</argument>                             </arguments>                         </configuration>                     </plugin>                 </plugins>             </build>             <properties>                 <!-- log configuration -->                 <logback.loglevel>INFO</logback.loglevel>             </properties>             <dependencies>                 <dependency>                     <groupId>org.springframework.boot</groupId>                     <artifactId>spring-boot-starter-tomcat</artifactId>                 </dependency>             </dependencies>         </profile>     </profiles> </project> 

and chile pom is

<?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>         <artifactId>demo-jhipster</artifactId>         <groupId>com.aquevix.demo</groupId>         <version>0.0.1-SNAPSHOT</version>     </parent>     <artifactId>JhipsterSubmodule1</artifactId> </project> 

I have googled but not found any solution please help in this regard!

enter image description here

like image 563
Qasim Avatar asked Sep 03 '15 06:09

Qasim


People also ask

How does spring Boot find main class?

A Spring Boot application's main class is a class that contains a public static void main() method that starts up the Spring ApplicationContext. By default, if the main class isn't explicitly specified, Spring will search for one in the classpath at compile time and fail to start if none or multiple of them are found.

How do I read properties file in spring boot main class?

Another very simple way to read application properties is to use @Value annotation. Simply annotation the class field with @Value annotation providing the name of the property you want to read from application. properties file and class field variable will be assigned that value.

Why does a spring boot application need a main () method?

2 Answers. Show activity on this post. Method main is an entry point for standalone applications, so if you want to use spring boot standalone application, usually (if not always) packaged into a JAR - then yes, you should use main method.


2 Answers

I believe the issue I was having is similar to yours. I have a multi module app using Spring Boot and only one Application.java (with main method).

I was struggling with it trying to start it up using Maven and I got the same result as yours (unable to find a suitable main class).

I spent several hours trying and changing stuff and after adding the property mainClass to the pom, it couldn't find it.

Then I decided to run the project not from the root project but from the project where the Application class is.

By doing this I was able to start up Spring Boot and everything works like a charm.

Updated

If you want to package the whole thing to be executed with java -jar file you can run the command below from the root project:

mvn clean package spring-boot:repackage  

Don't forget to add the spring-boot-maven-plugin to your pom.

like image 111
Paulo Pedroso Avatar answered Sep 22 '22 09:09

Paulo Pedroso


In my case i had in main pom:

<parent>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-parent</artifactId>     <version>2.0.3.RELEASE</version> </parent> 

whitch includes plugin spring-boot-maven-plugin

I had to add to main pom to skip it:

    <plugin>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-maven-plugin</artifactId>         <configuration>             <skip>true</skip>         </configuration>     </plugin> 

and then in module with ma Application class:

    <plugin>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-maven-plugin</artifactId>         <configuration>             <skip>false</skip>         </configuration>     </plugin> 
like image 40
ajasiocha Avatar answered Sep 22 '22 09:09

ajasiocha