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!
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.
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.
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.
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.
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.
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With