programing

스프링 부트:다음 후보에서 기본 클래스를 찾을 수 없습니다.

oldcodes 2023. 3. 10. 22:45
반응형

스프링 부트:다음 후보에서 기본 클래스를 찾을 수 없습니다.

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

반응형