Spring Kann die applicationContext.xml nicht finden

Dieses Thema Spring - Kann die applicationContext.xml nicht finden im Forum "Application Tier" wurde erstellt von LostForce, 2. März 2016.

Thema: Kann die applicationContext.xml nicht finden Hallo Community, ich habe mein Problem jetzt schön öfters gegooglt. Ich bin auch auf viele Antworten gestoßen,...

  1. Hallo Community,

    ich habe mein Problem jetzt schön öfters gegooglt. Ich bin auch auf viele Antworten gestoßen, allerdings hat keine geholfen. Bereits sind schon einige Stunden Recherche drauf gegangen, sodass ich mich nun dafür entscheide meine Frage in einem Forum zu stellen.

    Ich habe ein neues Projekt in eclipse mittels maven gestartet. Nachdem ich dies getan habe, habe ich als dependencies Hibernate und Spring hinzugefügt (... und eine weitere).
    Das Projekt ist kein normales "public static void main" Projekt, sondern vielmehr ein Plugin für eine andere Software (Bukkit, falls das jemanden etwas sagt).

    Nun zu meinem Problem:
    Wenn ich mein Plugin mittels maven gebaut habe und es über die andere Software versuche zu starten, erhalte ich folgende Fehlermeldung:

    org.bukkit.plugin.InvalidPluginException: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException:
    class path resource [applicationContext.xml] cannot be opened because it does not exist

    Die applicationContext.xml befinden sich in meinem src/main/resources Ordner. Dieser Ordner ist auch ein Teil des classpaths. Das habe ich mittels winRar kontrolliert. Nach dem erfolgreichen bauen des Projektes, befindet diese sich nämlich im dem root Ordner.
    Bild:
    [​IMG]

    Zudem benutze ich das maven-shade-plugin, um alle dependencies in eine jar zu packen.
    Sieht dann folgendermaßen aus:
    Code (Text):

    <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <shadedArtifactAttached>true</shadedArtifactAttached>
                                <transformers>
                                    <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <manifestEntries>
                                            <mainClass>com.lostforce.core.LostForceCore</mainClass>
                                        </manifestEntries>
                                    </transformer>
                                </transformers>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
     
    Die applicationContext.xml kann aufjedenfall gefunden werden! Dies habe ich mit diesem Codeschnipsel überprüft:
    Code (Text):
    System.out.println("Is null: " + (getClassLoader().getResourceAsStream("applicationContext.xml") == null));
    Diese Datei versuche ich beim starten mittels diesem Aufruf zu laden:
    Code (Text):
    context = new ClassPathXmlApplicationContext("applicationContext.xml");
    Mein Projekt sieht so aus:
    [​IMG]

    Zur Info: Wenn ich das Programm mittels "public static void main(...)" aus eclipse heraus starte, dann funktioniert es komischer weise. Liegt es nun an dem Plugin Konzept?
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. Problem alleine gelöst! Da mein Projekt ein plugin ist, musste ich den vom Hauptprogramm bekannten Classloader überschreiben.
    Lösung:

    Code (Text):

    public class SpringBootstrap {
       
        private final ClassLoader classLoader = SpringBootstrap.class.getClassLoader();
       
        public ApplicationContext startupSpring() {
            ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml") {
                protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
                    super.initBeanDefinitionReader(reader);
                    reader.setValidationMode(XmlBeanDefinitionReader.VALIDATION_NONE);
                    reader.setBeanClassLoader(classLoader);
                    setClassLoader(classLoader);
                }
            };
            return context;
        }
    }