실행 가능한 jar에 사용할 기본 클래스를 Spring Boot에 알리려면 어떻게합니까?


182
Execution default of goal 
org.springframework.boot:spring-boot-maven-plugin:1.0.1.RELEASE:repackage 
failed: 
Unable to find a single main class from the following candidates

내 프로젝트에는 main메소드 가있는 둘 이상의 클래스가 있습니다. Spring Boot Maven 플러그인에 어떤 클래스를 기본 클래스로 사용해야하는지 어떻게 알 수 있습니까?


1
java -cp myjar.jar MyClass
Evgeni Dimitrov

4
@Evgeni : 런타임 플래그입니다. 그렇게 멀지 않습니다. 빌드에 실패했습니다.
Thilo

답변:


268

응원단에 시작 수업을 추가하십시오.

<properties>
    <!-- The main class to start by executing java -jar -->
    <start-class>com.mycorp.starter.HelloWorldApplication</start-class>
</properties>

또는

<build>
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>             
        <configuration>    
            <mainClass>com.mycorp.starter.HelloWorldApplication</mainClass>
        </configuration>
    </plugin>
</plugins>
</build>

아무것도 비활성화 할 필요가 없습니다. 아니면 뭔가 빠졌습니까?
Dave Syer

29
spring-boot-starter-parent pom을 사용하는 경우이 답변이 정확합니다. 이 경우 "start-class"속성은 spring-boot-maven-plugin의 "mainClass"구성 매개 변수에 적용됩니다 (스타터를 사용하지 않는 경우 직접 수행 할 수 있음).
Dave Syer

18
@ludo_rj에게 감사드립니다. 또한 다음 mvn clean package -Dstart-class=com.foo.Application과 같이 작동합니다. , 어떤 메인 클래스를 사용하여 동적으로 지정하려면
zhuguowei

2
한 가지 더 추가해야 할 점은 @zhuguowei에서 언급 한 매개 변수는 Spring Boot Maven Plugin에도 유효합니다 mvn spring-boot:run -Dstart-class=com.foo.Application. 이것은 pom의 플러그인에 mainClass를 지정하지 않은 경우에만 유효합니다.
Gerardo Roza

둘 다 나를 위해 작동하지 않았다. 또한 "아니오"라고 생각했습니다. MANIFEST.MF에서 Start-Class :가 올바르게 표시되지만 스프링은 다른 주석이 달린 @SpringBootApplication 기본 클래스를 시작합니다. 실제로 주석을 변경하는 것을 좋아하지 않기 때문에 일부를 부트 스트랩하려면 해당 클래스가 필요합니다. 단순히 제거해도 어쨌든 작동하지 않았습니다. Spring은 처음으로 찾은 main ()을 시작하는 것 같습니다. spring-boot-starter-parent 2.2.0.M3을 사용하고 있습니다.
Angel O'Sphere

129

Maven 대신 Gradle을 사용하는 사람들 :

springBoot {
    mainClass = "com.example.Main"
}

2
Spring Boot 2.x에서 오류가 발생했습니다 Could not set unknown property 'mainClass' for object of type org.springframework.boot.gradle.dsl.SpringBootExtension.
Thunderforge

대답은이 페이지에 있습니다 : stackoverflow.com/a/49716696/75672
Vitalik

70

spring-boot-starter-parent pom을 사용하지 않으면 Spring 설명서 에서 다음을 수행하십시오 .

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.1.3.RELEASE</version>
    <configuration>
        <mainClass>my.package.MyStartClass</mainClass>
        <layout>ZIP</layout>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

메인 클래스 설정은 생략 가능
zhaozhi

@zhaozhi 왜 / 어떻게 설명 할 수 있습니까?
Renaud

19

Maven 대신 Gradle을 사용하는 사람들은 여기를 참조 하십시오 .

작업의 mainClassName 속성을 사용하여 기본 클래스를 명시 적으로 구성 할 수도 있습니다.

bootJar {
    mainClassName = 'com.example.ExampleApplication'
}

또는 스프링 부트 DSL의 mainClassName 속성을 사용하여 메인 클래스 이름을 프로젝트 전체에서 구성 할 수 있습니다.

springBoot {
    mainClassName = 'com.example.ExampleApplication'
}

15

pom에서 spring-boot-starter-parent를 사용하는 경우 간단히 pom에 다음을 추가하십시오.

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

그런 다음 mvn 패키지를 수행하십시오.

참조 이 봄 문서 페이지를 .

여기서 매우 중요한 측면은 디렉토리 구조가 src / main / java / nameofyourpackage이어야한다는 것입니다.


.java 클래스에 대한 패키지 요구 사항을 복제하면 pom.xml을 수정하지 않고이 솔루션이 작동하는 것으로 나타났습니다.

6

pom.xml에서 다음 코드를 시도해 보았습니다.

<build>
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
            <mainClass>myPackage.HelloWorld</mainClass> 
        </configuration>
    </plugin>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <fork>true</fork>
            <executable>D:\jdk1.8\bin\javaw.exe</executable>
        </configuration>
    </plugin>
</plugins>


여러 멀티 플랫폼 maven 프로젝트에서 언급 한 spring-boot-maven-plugin 구성을 여러 Spring 부트 프로젝트로 구성하고 Spring Boot를 BOM 종속성으로 포함하여 사용하려고 시도했지만 매력처럼 작동했습니다. maven-compiler-plugin과 관련하여 POM 플랫폼에 의존하지 않기 때문에 아무것도 지정하지 않았습니다. Maven은 자동으로 포크 되므로이 구성을 무시할 수 있다고 생각합니다.
Cheloute

4

Spring Boot 1.5부터는 오류가 발생하기 쉬운 문자열 리터럴을 pom 또는 build.gradle에서 무시할 수 있습니다. 리 패키징 도구 (maven 또는 gradle 플러그인을 통해)가 주석이 달린 도구를 선택합니다 @SpringBootApplication. (자세한 내용은이 문제를 참조하십시오 : https://github.com/spring-projects/spring-boot/issues/6496 )


3

나는 프로젝트의 이름을 바꾸었고 여전히 Application빌드 경로 에서 이전 클래스를 찾고있었습니다 . 나는 'build'폴더에서 그것을 제거하고 모두 괜찮 았습니다.


1

기본 클래스가 명시 적으로 지정되지 않은 Java 1.9 및 SpringBoot 1.5.x에서이 문제를 보았습니다.

Java 1.8을 사용하면 명시 적 속성없이 주 클래스를 찾을 수 있으며 'mvn package'가 올바르게 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.