Hallo Freunde, ich entwickle ein Springboot-Maven-basiertes Projekt, und ich habe ein Maven-Submodul erstellt, aber wenn ich versuche, mein Projekt auszuführen, gibt es einen Fehler
[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)
mein Elternteil Pom und Kind Pom ist
<?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>
und chile pom ist
<?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>
Ich habe gegoogelt, aber keine Lösung gefunden. Bitte helfen Sie diesbezüglich!
Ich glaube, das Problem, das ich hatte, ähnelt Ihrem. Ich habe eine Multi-Modul-App mit Spring Boot und nur eine Application.Java (mit Hauptmethode).
Ich hatte Probleme damit, zu versuchen, es mit Maven zu starten, und ich erhielt dasselbe Ergebnis wie Ihr (Konnte keine passende Hauptklasse finden).
Ich verbrachte mehrere Stunden damit, Dinge zu testen und zu ändern. Nachdem ich die Eigenschaft mainClass zum Pom hinzugefügt hatte, konnte sie sie nicht finden.
Dann habe ich beschlossen, das Projekt nicht vom Stammprojekt aus auszuführen, sondern von dem Projekt, in dem sich die Application-Klasse befindet.
Auf diese Weise konnte ich Spring Boot starten und alles funktioniert wie ein Zauber.
------- hinzugefügt am 09.08.2017
Wenn Sie das gesamte auszuführende Paket mit Java -jar file
packen möchten, können Sie den folgenden Befehl vom Stammprojekt aus ausführen:
mvn clean package spring-boot:repackage
Vergessen Sie nicht, das Spring-Boot-Maven-Plugin zu Ihrem Pom hinzuzufügen.
Entfernen Sie den Maven Build-Plugin-Code aus dem übergeordneten Pom, der dem folgenden ähnlich ist. Das folgende Snippet sollte nur im Submodul Pom sein, in dem Sie über die Hauptklasse für Spring Boot-Anwendung verfügen:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
In meinem Fall hatte ich in main pom:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
was beinhaltet das Plugin Spring-Boot-Maven-Plugin
Ich musste zu main pom hinzufügen, um es zu überspringen:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
und dann im Modul mit ma Application class:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
</plugin>
Sie können das Problem beheben, indem Sie den Speicherort von main wie folgt angeben:
mvn spring-boot {com.ishanitech.controller.Application}:run
Haben Sie eine Klasse in Ihrer App mit einer Hauptmethode wie:
public static void main(String[] args) {
SpringApplication.run(YourApplication.class, args);
}
Oder haben Sie sogar mehrere Klassen mit Hauptmethoden? In diesem Fall kann Spring nicht herausfinden, welche Klasse verwendet werden soll.
Vielleicht haben Sie vergessen, die Hauptklasse anzugeben, um zu beginnen.
In pom.xml:
<properties>
<start-class>com.ishanitech.controller.Application</start-class>
</properties>
Ich habe das in zwei Schritten gelöst:
mvn install
aus.mvn clean spring-boot:start
mvn clean spring-boot:start
… Gibt Ihnen den gleichen Fehler.
mvn clean package spring-boot:start
… Behebt das Problem, indem das Artefakt erstellt wird, bevor sprint-boot:start
ausgeführt wird.
Wenn Sie versuchen, einen mvn spring-boot:run
oder nur eine mvn
(da Sie scheinbar JHipster verwenden und dies ist die Art und Weise, wie sie es als Standardziel verwenden) im Stamm Ihres Projekts auszuführen, ist es normal, dass dies fehlschlägt nur in einem schlichten Federstiefelprojekt verwendet werden.
Da in Ihrem übergeordneten Projekt mehrere Spring-Boot-Webapps vorhanden zu sein scheinen, denke ich, dass jedes über eine eigene () Startklasse () verfügt und Sie nur einen übergeordneten Pom verwenden, um Ihre Poms zu Faktorisieren und alle Ihre Anwendungen einzeln über paketieren können ein einzelner Befehl.
Führen Sie in diesem Fall also einfach einen mvn package
und nicht eine mvn
oder einen mvn spring-boot:run
aus.
Ich hatte das gleiche Problem. In meinem Fall war es, weil ich meine Hauptklasse in einem Paket hatte, das nicht "Eltern" zu meinen anderen Paketen war, die Controller, Entitäten usw. enthielten. Etwas wie das:
+- com.domain.myapp.app
| \- Application.Java
+- com.domain.myapp.controllers
| \- AppController.Java
+- com.domain.myapp.entities
| \- AppEntity.Java
+- com.domain.myapp.services
| \- AppService.Java
+- com.domain.myapp.repository
| \- AppRepo.Java
Die Lösung bestand darin, meine Hauptklasse in ein Paket zu verschieben, das hierarchisch über den anderen Paketen liegt, da Spring Boot dieses Paket und alle Unterpakete automatisch nach Klassen mit @Entity-, @Component-, @Service- und @Repository-Anmerkungen durchsucht. Das Ergebnis war ungefähr so:
+- com.domain.myapp
| \- Application.Java
| +- com.domain.myapp.controllers
| | \- AppController.Java
| +- com.domain.myapp.entities
| | \- AppEntity.Java
| +- com.domain.myapp.services
| | \- AppService.Java
| +- com.domain.myapp.repository
| | \- AppRepo.Java
Ich hoffe es hilft!
Grüße
Wenn Sie IntellJ IDEA
verwenden, können Sie dies vielleicht folgendermaßen tun:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>add.your.main.class.application.reference.here</mainClass>
</configuration>
</plugin>
Dies hat meinen Fehler behoben.
Wenn Sie den offiziellen Handbüchern folgen und das Repository auf lokal kopieren, gelangen Sie zu Ordnern. Die Handbücher lassen Sie cd initial
, machen Sie das nicht, cd complete
und es gibt kein Problem.
Ich bin auch mit dem gleichen Problem konfrontiert, aber durch Hinzufügen der folgenden Zeile in meiner pom.xml habe ich das Problem für mein Projekt behoben:
<properties>
<start-class>com.hls.om.wp.AgencySearch</start-class>
</properties>
die AgencySearch
-Klasse verfügt über die Hauptmethode zum Ausführen der Spring-Boot-Anwendung.