2017-04-26 1 views
0

J'ai écrit le plugin maven qui utilise l'injection de dépendance de contexte de ressort.Spring: Demande les propriétés de chargement dans le projet de plugin maven mais utilise le fichier du projet dans lequel le plugin est utilisé

À un certain moment, le ressort doit initialiser l'un des beans avec le fichier de propriétés. Dans les tests tout fonctionne bien. Mais lorsque le plugin est construit et utilisé dans un projet différent dans le cadre du processus de construction, FileNotFoundException est lancé.

Lors de l'impression des entrées en cours de classpath en utilisant:

ClassLoader cl = ClassLoader.getSystemClassLoader(); 
URL[] urls = ((URLClassLoader)cl).getURLs(); 
for(URL url: urls){ 
    System.out.println("CLASSPATH: " + url.getFile()); 
} 

seule chose que je reçois est:

CLASSPATH: /path/to/mavendir/boot/plexus-classworlds-2.5.2.jar 

Et normalement propriétés sont chargées par le code suivant:

Resource resource = springContext.getResource("classpath:/myPluginConfig.properties"); 
Properties properties = PropertiesLoaderUtils.loadProperties(resource); 

Mais fichier n'est pas trouvé.

Je l'ai placé le fichier correctement nommé "de myPluginConfig.properties" dans /src/main/resources/ dans le projet qui utilisent mon plugin.

Lors de la phase des ressources de processus, le fichier est copié dans le répertoire target/classes (j'ai vérifié son existence). Donc le fichier est là mais le classpath est en quelque sorte cassé. Mon plugin n'est installé que localement comme image instantanée, donc je peux le mettre à jour rapidement et le réinstaller.

Quelqu'un peut-il m'aider s'il vous plaît à résoudre ce problème?

Répondre

1

lorsque nous utilisons le pot dans le projet diffrent, le chemin des ressources devrait comme ceci: classpath *: myPluginConfig.properties

+0

Salut. Merci pour la réponse rapide. Malheureusement, il ne fonctionne pas dans mon cas :-(D'autres possibilités? – termil0r

+0

s'il vous plaît donnez-moi la capture d'écran de votre pot utilisé dans le projet comme un plugin – amose

0

réponse à ma question est:

  1. Dans projet plugin Maven avant le printemps contexte est initialisé modifier classpath classpath à exécution en ajoutant le contexte du système Maven classpath original solution on how to do this et ci-dessous mon légèrement modifié un

Cela devrait être appelé my maven pendant l'exécution de mojo. De préférence le plus tôt possible.

private void enhanceClassloaderAndInitSpring() { 
     try { 
      Set<URL> urls = new HashSet<>(); 
      List<Stream<String>> streams = new ArrayList<>(); 
      streams.add(project.getRuntimeClasspathElements().stream()); 
      streams.add(project.getCompileClasspathElements().stream()); 
      streams.add(project.getSystemClasspathElements().stream()); 

      for (String element : streams.stream().flatMap(s -> s).collect(Collectors.toList())) { 
       System.out.println("Adding element to classpath: " + element); 
       urls.add(new File(element).toURI().toURL()); 
      } 

      ClassLoader contextClassLoader = URLClassLoader.newInstance(
        urls.toArray(new URL[0]), 
        Thread.currentThread().getContextClassLoader()); 

      Thread.currentThread().setContextClassLoader(contextClassLoader); 

      // springContext is just local field in class 
      springContext = initSpringContext(); 
     } catch (DependencyResolutionRequiredException e) { 
      throw new RuntimeException(e); 
     } catch (MalformedURLException e) { 
      throw new RuntimeException(e); 
     } 
    } 
  1. Init contexte de printemps
  2. Utilisez java classloader ou le contexte du printemps pour obtenir des ressources, mais ne pas préfixer chaîne de ressource avec "classpath:" (au moins dans mon cas ne fonctionnait pas)

    Resource resource = springContext.getResource("myPluginConfig.properties"); 
    if (!resource.exists()) { 
        throw new RuntimeException("Resource does not exist and resource object pointing to nothing was created"); 
    } 
    
    Properties properties = PropertiesLoaderUtils.loadProperties(resource);