Spring Boot - Comment spécifier une autre start-classe? (Plusieurs Points D'Entrée)
Je veux ajouter un autre point d'entrée de mon Printemps-Démarrage de l'application. Je préfère garder cela comme un gros pot. Est-ce possible?
En fonction de leur la documentation, la propriété loader.main
spécifie le nom de la classe principale pour lancer.
J'ai essayé java -jar MyJar.jar --loader.main=com.mycompany.AlternateMain
, mais le début de la classe spécifiée dans mon pom.xml était encore exécuter (et si j'enlève ce à partir de la pom.xml ensuite, j'ai l'erreur lors de l'emballage).
Sinon, j'ai essayé java -cp MyJar.jar com.mycompany.AlternateMain
mais je n'en connais pas un bon moyen d'ajouter toutes imbriquées les pots pour le classpath.
Des suggestions?
Edit: Voici la solution que j'ai utilisé
Jst comme suggéré, j'ai changé mon lanceur d'utiliser le PropertiesLauncher. Je l'ai fait en modifiant la configuration de mon spring-boot-maven-plugin.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>${start-class}</mainClass>
<layout>ZIP</layout>
...
La <layout>ZIP</layout>
les déclencheurs de Printemps de Démarrage d'utiliser la méthode PropertiesLauncher
.
J'ai créé mes gros pot (mvn package) alors appelé l'autre principal comme ceci:
java -jar -Dloader.main=com.mycompany.AlternateMain MyJar.jar
Merci pour l'aide!
- Printemps de Démarrage utilise simplement le POT de Manifeste pour spécifier la classe principale et du chemin de classe. Donc, je pense que la vraie question ici est peut-il y avoir plus d'une grande Classe dans un fichier exécutable JAR? Cette question est également demandé/réponse ici: stackoverflow.com/q/3976514/953327
- De quoi avez-vous l'intention de le faire avec cela? Voulez-vous créer de multiples applications à partir de Printemps de Démarrage?
- Je peux accéder à l'alternative principale à l'aide de la deuxième commande que j'ai noté, ce qui correspond à la réponse dans le fil que vous liez. Pour l'utiliser correctement, je dois comprendre comment ajouter mon imbriqués les pots pour le classpath.
- Je ne veux pas créer de multiples applications avec ce. C'est en fait une preuve de concept que je fais maintenant, mais j'ai utilisé de multiples points d'entrée dans le passé pour une variété de raisons
Vous devez vous connecter pour publier un commentaire.
Je ne crois pas que la propriété serait de s'appliquer dans votre cas. Il existe 3 types de "Lanceurs" (retourner à la documentation et à voir). Si vous êtes à la construction d'un pot il utilise le JarLauncher classe. Si vous passez à PropertiesLauncher ensuite chargeur.principal serait utile.
META-INF/MANIFEST.MF
J'ai pris une approche différente et l'utilisation d'un paramètre de ligne de commande pour déterminer la classe à utiliser comme mon SpringApplication classe. Je n'ai qu'une seule méthode main (), mais les différentes classes de l'Application avec des configurations différentes qui sont utilisées sur la base d'une ligne de commande param.
J'ai une classe unique avec une main (): les
Mais j'ai 2 différents SpringApplication classes: Application.class & CreateDB.class. Chaque classe définit un autre
@ComponentScan
chemin d'accès ainsi que les différentes@EnableAutoConfiguration
options et différents@Configuration
options. Enfin, d'après mes arguments de ligne de commande, je peux décider d'en programmant de permettre à plus de profils/etc.Dans mon cas, je veux un autre launcher, il suffit de créer la DB de schéma et de sortie, j'ai donc forcé le paramètre de ligne de commande.
CreateDB
etApplication
existent dans des colis séparés, vous permettant ainsi de l'utiliser@ComponentScan
avecbasePackages
ensemble de ce paquet?@ComponentScan()
explicitement ensembles de différents paquets de base à l'analyse avec les différentes règles d'exclusion. Il vous permet également d'avoir différents@AutoConfiguration()
options, différentes Config de classes, etc. Et honnêtement, je trouve ça beaucoup plus facile de le faire de cette façon plutôt que d'utiliser le lanceur et le lanceur d'applications des paramètres pour spécifier les longs noms de classe; cela me permet d'abstraire, de quelque manière que je veux. J'ai essentiellement emballés séparer les 2 SpringBoot apps (qui partagent des classes) dans le même bocal.Je vous suggérerais d'avoir un seul
main
mais à l'aide de Printemps profils (ou propriétés de configuration) pour sélectionner l'un ou l'autre "point d'entrée"@Configuration
classe.