web-dev-qa-db-ja.com

Spring Boot-代替の開始クラスを指定する方法は? (複数のエントリポイント)

Spring-Bootアプリケーションに代替エントリポイントを追加したい。私はこれを太い瓶のままにしておきたいです。これは可能ですか?

彼らの documentation によると、プロパティloader.mainは、起動するメインクラスの名前を指定します。

私は試した Java -jar MyJar.jar --loader.main=com.mycompany.AlternateMainしかし、pom.xmlで指定されたstart-classはまだ実行されていました(これをpom.xmlから削除すると、パッケージング中にエラーが発生します)。

または、Java -cp MyJar.jar com.mycompany.AlternateMainしかし、ネストされたすべてのjarをクラスパスに追加するための適切な方法がわかりません。

助言がありますか?

編集:これが私が使用した解決策です

Jstが提案したように、Launcherを変更してPropertiesLauncherを使用しました。これを行うには、spring-boot-maven-pluginの構成を変更します。

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <configuration>
    <mainClass>${start-class}</mainClass>
    <layout>Zip</layout>
    ...

<layout>Zip</layout>PropertiesLauncher を使用するようにSpring Bootをトリガーします。

私は自分のファットjar(mvnパッケージ)を作成し、次のように代替メインを呼び出しました。

Java -jar -Dloader.main=com.mycompany.AlternateMain MyJar.jar

助けてくれてありがとう!

私はあなたの場合に財産が適用されるとは思わない。 3つの異なる「ランチャー」があります(ドキュメントに戻って参照してください)。 jarを構築する場合は、JarLauncherクラスを使用します。 PropertiesLauncherに切り替えると、loader.mainが役立ちます。

META-INF/MANIFEST.MF

Main-Class: org.springframework.boot.loader.PropertiesLauncher
9
jst

別のアプローチをとり、コマンドラインパラメーターを使用して、SpringApplicationクラスとして使用するクラスを決定しました。 main()メソッドは1つしかありませんが、コマンドラインパラメータに基づいて使用される、異なる構成の異なるアプリケーションクラスがあります。

Main()を含む単一のクラスがあります:

public static void main(String[] args) {
    SpringApplication app;
    if( ArrayUtils.contains(args, "--createdb")){
        app = new SpringApplication(CreateDB.class);
        args = (String[])ArrayUtils.add(args, "--spring.jpa.hibernate.ddl-auto=create");
    } else {
        app = new SpringApplication(Application.class);
    }

    app.setWebEnvironment(false);
    app.setShowBanner(false);
    app.addListeners(new ConfigurationLogger());

    // launch the app
    ConfigurableApplicationContext context = app.run(args);

    // finished so close the context
    context.close();
}

しかし、2つの異なるSpringApplicationクラスがあります。Application.classとCreateDB.classです。各クラスは、異なる@ComponentScanパスと、異なる@EnableAutoConfigurationオプションおよび異なる@Configurationオプションを定義します。最後に、コマンドライン引数に基づいて、追加のプロファイルなどをプログラムで有効にするかどうかを決定できます。

私の場合、別のランチャーでDBスキーマを作成して終了するだけなので、コマンドラインパラメーターを強制しました。

10
Eric B.

単一のmainを使用することをお勧めしますが、Springプロファイル(または構成プロパティ)を使用して、1つまたは他の「エントリポイント」を選択します@Configurationクラス。

3