web-dev-qa-db-fra.com

Obtenir ArtifactId et sa version dans Spring Boot Starter

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

6
Matthew Fontana

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.

10
Matthew Fontana

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 .

2
Vojtech Ruzicka