実行可能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 2014

回答:


268

pomに開始クラスを追加します。

<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 14

29
この答えは、spring-boot-starter-parent pomを使用している場合は正しいことに注意してください。その場合、「start-class」プロパティは、spring-boot-maven-plugin(スターターを使用していない場合は直接実行できます)の「mainClass」構成パラメーターに適用されます。
Dave Syer 14

18
@ludo_rjに感謝し、これも機能することを発見しました:mvn clean package -Dstart-class=com.foo.Application、どのメインクラスを使用して動的に指定したい場合
zhuguowei

2
もう1つ追加する必要があるのは、@ zhuguoweiによって言及されたパラメーターがSpring Boot Mavenプラグインに対しても有効であるということですmvn spring-boot:run -Dstart-class=com.foo.Application。これは、pomのプラグインでmainClassを指定していない場合にのみ有効です
Gerardo Roza

どちらもうまくいきませんでした。また、それは「AND」であるとは考えていませんでしたか。Start-Class:はMANIFEST.MFに正しく表示されますが、Springは注釈付きの@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はなぜ/どのように説明できますか?
ルノー、

19

(Mavenの代わりに)Gradleを使用している人は、ここを参照してください

メインクラスは、タスクのmainClassNameプロパティを使用して明示的に構成することもできます。

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

または、Spring Boot 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>


いくつかのSpringブートプロジェクトで構成され、BOM依存関係としてSpring Bootを含む、私のmultimodules mavenプロジェクトで言及したspring-boot-maven-plugin構成を使用しようとしたところ、それは魅力のように機能しました。maven-compiler-pluginについては、POMプラットフォームに依存させたくないため、何も指定しませんでした。Mavenは自動的にforkされるので、この構成は無視してかまいません。
Cheloute 2017年

4

Spring Boot 1.5以降、pomまたはbuild.gradleでエラーが発生しやすい文字列リテラルを完全に無視できます。(mavenまたはgradleプラグインを介した)再パッケージ化ツールは、注釈が付けられたツールを選択@SpringBootApplicationします。(詳細については、この問題を参照してください:https : //github.com/spring-projects/spring-boot/issues/6496


3

私は自分のプロジェクトの名前を変更しましたが、それでもビルドパスで古いApplicationクラスが見つかりました。'build'フォルダーから削除しましたが、すべて問題ありませんでした。


1

main-classが明示的に指定されていない場合、Java 1.9およびSpringBoot 1.5.xでこの問題が発生しています。

Java 1.8では、明示的なプロパティなしでメインクラスを見つけることができ、「mvnパッケージ」は正常に動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.