Je développe actuellement un démarreur de démarrage de printemps qui hébergera un service Web reposant avec des métadonnées sur l'application en cours d'exécution.
J'ai des difficultés à extraire mes artefactId et versionId de mon fichier mainfest. Je crois que mon problème est que les classes de configuration automatique sont chargées avant l'application Test principale, de sorte que le manifeste n'est pas encore disponible pour être découvert. Je ne suis pas sûr si ma logique ici est correcte ou si j'aborde le problème sous le mauvais angle.
A l'origine, j'avais suivi le tutoriel } _ suivant pour la configuration.
Cela m'a donné 3 projets distincts
Generic Spring Services with no context
AutoConfiguration project for these services
Spring Boot starter
J'ai couplé le démarreur avec un projet test en tant que résultat final.
Actuellement, maven est utilisé avec Spring Boot pour générer un fichier manifeste.
Implementation-Title: MyExampleProjectWithCustomStarter
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: mcf
Implementation-Vendor-Id: com.coolCompany
Spring-Boot-Version: 1.5.4.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: com.coolcompany.SpringBootExampleApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_131
Implementation-URL: http://someurl
Toutefois, lorsque je tente de localiser le fichier manifeste du projet Example à partir de mon package de service générique, je ne le trouve pas.
private String getApplicationVersion(String applicationName, List<Attributes> manifests) {
String unknownVersion = "0.0.0-UNKNOWN";
for (Attributes attr : manifests) {
String title = attr.getValue(IMPL_TITLE);
String version = attr.getValue(IMPL_VERSION);
if (version != null) {
if (applicationName.equalsIgnoreCase(title)) {
return title + ' ' + version;
}
}
}
log.warn(
"Could not find MANIFEST file with '" + applicationName + "' as Implementation-Title."
+ " Meta-API will return buildVersion '" + unknownVersion + "'.");
return applicationName + ' ' + unknownVersion;
}
private List<Attributes> loadManifestFiles() {
List<Attributes> manifests = new ArrayList<>();
try {
Enumeration<URL> resources =
Thread.currentThread().getContextClassLoader().getResources("/META-INF/MANIFEST.MF");
while (resources.hasMoreElements()) {
URL url = resources.nextElement();
try (InputStream is = url.openStream()) {
manifests.add(new Manifest(is).getMainAttributes());
System.out.println("Manifest size:" + manifests.size());
} catch (IOException e) {
log.error("Failed to read manifest from " + url, e);
}
}
} catch (IOException e) {
log.error("Failed to get manifest resources", e);
}
return manifests;
}
Manifeste actuel Titres d'application:
Spring Boot Web Starter
Spring Boot Starter
Spring Boot
Spring Boot AutoConfigure
Spring Boot Logging Starter
null
null
jcl-over-slf4j
null
log4j-over-slf4j
null
Spring Boot Tomcat Starter
Apache Tomcat
Apache Tomcat
Apache Tomcat
hibernate-validator
null
JBoss Logging 3
ClassMate
jackson-databind
Jackson-annotations
Jackson-core
spring-web
spring-aop
spring-beans
spring-context
spring-webmvc
spring-expression
Spring Boot Actuator Starter
Spring Boot Actuator
null
** MyCustom-spring-boot-starter
** MyGenericSpringService
null
null
null
Metrics Core
JVM Integration for Metrics
null
null
Jackson datatype: JSR310
** MyService-spring-boot-autoconfigure
slf4j-api
spring-core
** MyExampleProjectWithCustomStarter manquant
nombre d'enregistrements de manifestes: 44
Hé les gars, après beaucoup d'efforts, j'ai trouvé une réponse étonnamment simple. (C’est ainsi que l’actionneur de démarrage à ressort obtient l’information)
Le plug-in Spring Boot Maven est équipé d'un objectif de compilation. Tant que cet objectif est déclenché dans le projet principal, Spring dispose d'une classe BuildProperties que vous pouvez connecter aux informations.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>build-info</id>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
Vous pouvez accéder aux propriétés de votre démarreur comme:
@Autowired
BuildProperties buildProperties;
...
buildProperties.getArtifact();
buildProperties.getVersion();
Vous pouvez même spécifier des propriétés supplémentaires à partir du plugin. Voir la documentation du plugin pour plus de détails: https://docs.spring.io/spring-boot/docs/current/maven-plugin/build-info-mojo.html
Malheureusement, je n'ai jamais vraiment compris pourquoi je ne pouvais pas accéder au manifeste correct, mais cela devrait aider quiconque tente de résoudre ce problème.
L'autre réponse est complètement correcte. Juste pour les autres qui trouvent cette question au cas où vous utiliseriez Gradle au lieu de Maven
Générer des informations de construction est aussi simple que de l'ajouter à votre fichier build.gradle
:
plugins {
id 'org.springframework.boot' version '<your-boot-version>.RELEASE'
}
// ...
springBoot {
buildInfo()
}
Et si vous voulez transmettre des propriétés personnalisées:
springBoot {
buildInfo {
properties {
additional = [
'property.name': 'property value',
'other.property': 'different.value'
]
}
}
}
Ensuite, l'utilisation dans le code Java est la même avec BuildProperties
. Vous pouvez trouver plus d'informations sur le plugin dans ce guide .