Frage Spring Boot - Wie spezifiziert man eine alternative Start-Klasse? (Mehrere Einstiegspunkte)


Ich möchte meiner Spring-Boot-Anwendung einen alternativen Einstiegspunkt hinzufügen. Ich würde es vorziehen, dies als ein dickes Glas zu behalten. Ist das möglich?

Nach Ihnen Dokumentation, die Eigenschaft loader.main Gibt den Namen der Hauptklasse an, die gestartet werden soll.

Ich habe es versucht java -jar MyJar.jar --loader.main=com.mycompany.AlternateMain aber die in meiner pom.xml angegebene start-klasse wurde noch ausgeführt (und wenn ich diese aus der pom.xml entferne, dann habe ich einen fehler beim packen).

Alternativ habe ich es versucht java -cp MyJar.jar com.mycompany.AlternateMain aber ich kenne keine gute Möglichkeit, alle verschachtelten Gläser dem Klassenpfad hinzuzufügen.

Irgendwelche Vorschläge?

Edit: Hier ist die Lösung, die ich verwendet habe

Wie vorgeschlagen, habe ich meinen Launcher geändert, um den PropertiesLauncher zu verwenden. Ich habe das gemacht, indem ich die Konfiguration meines Spring-Boot-Maven-Plugins verändert habe.

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

Das <layout>ZIP</layout>  löst Spring Boot aus, um das zu verwenden PropertiesLauncher.

Ich habe mein fettes Glas (mvn-Paket) erstellt und dann das alternative Haupt so genannt:

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

Danke für die Hilfe!


15
2018-06-26 15:24


Ursprung


Antworten:


Ich glaube nicht, dass Eigentum in Ihrem Fall gelten würde. Es gibt 3 verschiedene "Launcher" (gehen Sie zurück zur Dokumentation und sehen). Wenn Sie ein Jar erstellen, verwendet es die JarLauncher-Klasse. Wenn Sie es zu PropertiesLauncher wechseln, wäre loader.main nützlich.

META-INF / MANIFEST.MF

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

8
2018-06-26 15:51



Ich habe einen anderen Ansatz gewählt und einen Befehlszeilenparameter verwendet, um zu bestimmen, welche Klasse als meine SpringApplication-Klasse verwendet werden soll. Ich habe nur eine einzige main () -Methode, aber verschiedene Application-Klassen mit verschiedenen Konfigurationen, die basierend auf einem Befehlszeilenparameter verwendet werden.

Ich habe eine einzige Klasse mit einem main () drin:

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();
}

Aber ich habe 2 verschiedene SpringApplication-Klassen: Application.class & CreateDB.class. Jede Klasse definiert ein anderes @ComponentScan Pfad als auch anders @EnableAutoConfiguration Optionen und anders @Configuration Optionen. Schließlich kann ich anhand meiner Kommandozeilenargumente entscheiden, ob ich zusätzliche Profile / etc.

In meinem Fall möchte ich einen anderen Launcher, um nur das DB-Schema zu erstellen und zu beenden, also habe ich den Befehlszeilenparameter erzwungen.


8
2017-10-29 04:21



Ich würde vorschlagen, eine Single zu haben main aber mithilfe von Spring-Profilen (oder Konfigurationseigenschaften) den einen oder anderen "Einstiegspunkt" auswählen @Configuration Klasse.


3
2018-06-26 15:33