스프링 부트:다음 후보에서 기본 클래스를 찾을 수 없습니다.
Spring Initializer, Embedded Tomcat, Thymeleaf 템플릿 엔진을 사용하여 Spring Boot 웹 애플리케이션을 생성했습니다.사용하는 테크놀로지: Spring Boot 1.4.2.릴리즈, 스프링 4.3.4릴리스, Thymelaf 2.1.5.릴리스, Tomcat Embedd 8.5.6, Maven 3, Java 8
SpringBoot 앱은 다음 두 가지 클래스가 있습니다.
@Profile("!war")
@SpringBootApplication
@Import({SecurityConfig.class ,PersistenceConfig.class, ServiceConfig.class})
public class BookApplication {
public static void main(String[] args) {
SpringApplication.run(BookApplication.class, args);
}
}
@Profile("war")
@Import({SecurityConfig.class ,PersistenceConfig.class})
@SpringBootApplication
public class BookApplicationWar extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(BookApplicationWar.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(BookApplicationWar.class, args);
}
}
나는 이 명령으로 전쟁을 일으킨다.
mvn clean package -DskipTests -Dspring.profiles.active=pebloc,war -DAPP-KEY=pebloc
하지만 다음과 같은 오류가 발생했습니다.
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage (default) on project book: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.tdk.BookApplication, com.tdk.BookApplicationWar] -> [Help 1]
메인 클래스가 여러 개 있는 경우 각 프로파일에서 메인클래스를 명시적으로 설정해야 합니다.
<profiles>
<profile>
<id>profile1</id>
<properties>
<spring.boot.mainclass>com.SomeClass</spring.boot.mainclass>
</properties>
</profile>
<profile>
<id>profile2</id>
<properties>
<spring.boot.mainclass>com.SomeOtherClass</spring.boot.mainclass>
</properties>
</profile>
</profiles>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.5.2.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>${spring.boot.mainclass}</mainClass>
</configuration>
</execution>
</executions>
...
</plugin>
시작 클래스 속성을 통해 단일 기본 클래스 정의
<properties>
<start-class>com.may.Application</start-class>
</properties>
또는 spring-boot-maven-plugin에서 메인클래스를 정의합니다.
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.may.Application</mainClass>
</configuration>
</plugin>
</plugins>
</build>
또는 프로파일을 통해
<profiles>
<profile>
<id>profile1</id>
<properties>
<spring.boot.mainclass>com.may.Application1</spring.boot.mainclass>
</properties>
</profile>
<profile>
<id>profile2</id>
<properties>
<spring.boot.mainclass>com.may.Application2</spring.boot.mainclass>
</properties>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${spring.boot.mainclass}</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
스프링 부트 애플리케이션의 진입점을 명확히 하기 위해 Gradle 빌드 파일에 다음 지시문을 추가할 수 있습니다.
springBoot {
mainClassName = 'your.org.bla.TestKt'
}
이 에러는, mvn 의 클리닝을 실시하지 않고 mvn 인스톨 했을 때에 표시되는 경우가 있습니다.
또는 단순히 플러그인 구성의 메인 클래스를 하드 코드할 수도 있습니다.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>your.main.class.MainClass</mainClass>
</configuration>
</execution>
</executions>
</plugin>
명령줄에서 사용할 수 있습니다.
... -Dstart-class=com.your.package.application.BookApplication
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage (default) on project book: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.tdk.BookApplication, com.tdk.BookApplicationWar]
다음 오류가 발생하는 원인 중 하나는 코드에 여러 개의 주요 메서드가 있기 때문입니다.스프링 부트에서는 같은 프로젝트의 모든 클래스에 대해 하나의 메인 메서드만 사용할 수 있습니다.
으로 Spring Boot Application이 입니다.@SpringBootApplication
, 다른 것을 추가하는 경우main
, 어플리케이션에서는 메서드의 에 gradle을 합니다.따라서 루트 레벨에 다음 추가build.gradle
파일
apply plugin: 'application'
mainClassName = 'packageNameAfter.srcMainJavaFolder.YourClassName'
저도 같은 실수를 했어요.foo.java에서 bar.java로 메인인 어플리케이션클래스의 이름을 변경하고 클리닝 및 업데이트를 했습니다.그래서 저는 메인 하나밖에 없었어요.
대상 폴더 아래에 이전에 생성된 클래스 foo.class를 삭제하자 오류가 사라졌습니다.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>your.main.class.MainClass</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
요소 구성은 플러그인 구성 내부에 있어야 합니다.
「」를 가지는 는, 을 확인해 .public static void main(String[] args)
한 것을 합니다. 이치노 시 히히 specially specially specially specially specially https://start.spring.io/
메인 메서드가 포함된 클래스가 포함되어 있습니다.
메인 메서드의 모든 클래스가 필요한 경우, 어플리케이션에서 야유에 휘말릴 수 있는 것을 명시적으로 언급하기만 하면 됩니다.
스프링 부트 라이브러리 프로젝트를 빌드하고 있었기 때문에 메인 스타터 클래스가 필요 없기 때문에 maven을 사용하여 프로젝트를 빌드할 때 같은 문제에 직면하여 maven 플러그인을 제거하여 컴파일을 성공시켰습니다.
<!--
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
-->
좀 더 자세한 예를 들어보자.https://spring.io/guides/gs/multi-module/ 에서 찾을 수 있습니다.
오류를 피하기 위해 프로파일을 사용할 필요는 없습니다.spring-boot-maven-plugin은 다음과 같이 설정할 수 있습니다.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.3</version> <!-- use the corresponding version of your spring boot -->
<executions>
<execution>
<id>repackage-application1</id>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>com.yourpackage1.Application1</mainClass>
<finalName>app1</finalName>
<outputDirectory>target/apps</outputDirectory>
</configuration>
</execution>
<execution>
<id>repackage-application2</id>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>com.yourpackage2.Application2</mainClass>
<finalName>app2</finalName>
<outputDirectory>target/apps</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
대상 폴더에 app1.jar 및 app2.jar가 생성됩니다.
주의: spring-boot-starter-parent에서 상속받은 경우 기본적으로는 spring-boot-maven-plugin은 1개의 spring 어플리케이션만 상정하는 기본 설정으로 실행됩니다.모듈에 두 개의 앱이 있는 경우 기본 구성이 실패하고 "Unable to find an single main class" 오류가 발생합니다.빌드를 수정하려면 부모 POM에서 기본 플러그인 실행을 비활성화해야 합니다.한 가지 방법은 부모 pom에서 플러그인을 제외하는 것입니다.부모 pom에서 정의된 maven exclude plugin을 확인할 수 있습니다(직접 시도하지 않았습니다).
나는 두 개를 정의했다.@SpringBootApplication
일부러Gradle의 경합을 피하기 위해 대안과 함께 추가 작업을 정의했습니다.mainClass
:
tasks.named("bootRun", BootRun.class).configure {
mainClass = "com.evil.App"
}
tasks.named("bootJar", BootJar.class).configure {
mainClass = "com.evil.App"
}
tasks.register("bootRunH2", BootRun.class) {
group = bootRun.group
description = bootJar.description
mainClass = "com.evil.H2App"
}
tasks.register("bootJarH2", BootJar.class) {
group = bootJar.group
description = bootJar.description
targetJavaVersion = bootJar.targetJavaVersion
classpath = bootJar.classpath
mainClass = "com.evil.H2App"
}
이렇게 하면 여러 가지 다양한 정보를 얻을 수 있습니다.bootRun
/bootJar
원하는 대로 작업을 수행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/42840576/springboot-unable-to-find-a-single-main-class-from-the-following-candidates
'programing' 카테고리의 다른 글
각도에서의 후행 슬래시 처리UI 라우터 (0) | 2023.03.10 |
---|---|
javascript에서 localstorage setItem을 비동기식으로 실행하는 솔루션이 있습니까? (0) | 2023.03.10 |
Wordpress wp-admin 리다이렉트루프 다시 시작 (0) | 2023.03.10 |
angularjs에서의 패스워드 검사 지시어 (0) | 2023.03.10 |
오류: $digest() 반복 횟수가 10회에 달했습니다.중단 중! 동적 정렬 조건 포함 (0) | 2023.03.10 |