166 votes

Le fichier dans le jar n'est pas visible pour spring

Tous

J'ai créé un fichier jar avec le MANIFEST.MF suivant à l'intérieur :

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.8.3
Created-By: 1.6.0_25-b06 (Sun Microsystems Inc.)
Main-Class: my.Main
Class-Path: . lib/spring-core-3.2.0.M2.jar lib/spring-beans-3.2.0.M2.jar

Dans sa racine, il y a un fichier appelé my.config qui est référencé dans mon spring-context.xml comme ceci :

<bean id="..." class="...">
    <property name="resource" value="classpath:my.config" />
</bean>

Si je lance le jar, tout semble correct, sauf le chargement de ce fichier spécifique :

Caused by: java.io.FileNotFoundException: class path resource [my.config] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/D:/work/my.jar!/my.config
        at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:205)
    at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52)
    at eu.stepman.server.configuration.BeanConfigurationFactoryBean.getObject(BeanConfigurationFactoryBean.java:32)
    at eu.stepman.server.configuration.BeanConfigurationFactoryBean.getObject(BeanConfigurationFactoryBean.java:1)
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142)
    ... 22 more
  • les classes sont chargées depuis l'intérieur du jar
  • spring et les autres dépendances sont chargées à partir de jars séparés.
  • le contexte de printemps est chargé (new ClassPathXmlApplicationContext("spring-context/applicationContext.xml"))
  • my.properties est chargé dans PropertyPlaceholderConfigurer ("classpath:my.properties")
  • Si je place mon fichier .config en dehors du système de fichiers, et que je change l'url de la ressource en 'file:', tout semble aller bien...

Des conseils ?

0voto

J'ai eu le même problème, j'ai fini par utiliser le système beaucoup plus pratique Ressources en goyave :

Resources.getResource("my.file")

0voto

Abdullah Umer Points 760

Bien qu'il s'agisse d'un très vieux sujet, j'ai également été confronté au même problème lors de l'ajout de FCM dans une application Spring Boot.

Dans le développement, le fichier a été ouvert sans aucune erreur, mais lorsque j'ai déployé l'application vers AWS Elastic beanstalk, l'erreur de FileNotFoundException était lancé et le FCM ne fonctionnait pas.

Voici donc ma solution pour le faire fonctionner à la fois sur l'environnement de développement et le déploiement de jar de production.

J'ai une classe de composant FCMService qui a une méthode comme suit :

  @PostConstruct
  public void initialize() {

    log.info("Starting FCM Service");
    InputStream inputStream;

    try {

      ClassPathResource resource = new ClassPathResource("classpath:fcm/my_project_firebase_config.json");
      URL url = null;
      try {
        url = resource.getURL();
      } catch (IOException e) {

      }

      if (url != null) {
        inputStream = url.openStream();
      } else {
        File file = ResourceUtils.getFile("classpath:fcm/my_project_firebase_config.json");
        inputStream = new FileInputStream(file);
      }

      FirebaseOptions options = FirebaseOptions.builder().setCredentials(GoogleCredentials.fromStream(inputStream))
          .build();
      FirebaseApp.initializeApp(options);

      log.info("FCM Service started");

    } catch (IOException e) {
      log.error("Error starting FCM Service");
      e.printStackTrace();
    }

  }

J'espère que cela aidera quelqu'un qui cherche une solution rapide pour mettre en œuvre le FCM.

0voto

Alex Efimov Points 988

Peut être manipulé comme :

var serviceAccount = ClassLoader.getSystemResourceAsStream(FB_CONFIG_FILE_NAME);

FirebaseOptions options = new FirebaseOptions.Builder()
  .setCredentials(GoogleCredentials.fromStream(serviceAccount))
  .build();

Où FB_CONFIG_FILE_NAME est le nom du fichier dans votre dossier "ressources".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X