Spring context:component-scan: No such bean definition

Boiorix

Mitglied
Hallo zusammen!

Ich versuche den Component-Scan mit Spring zum laufen zu bekommen.
Aus den Sourcen klappt das auch. Wenn ich jetzt allerdings eine Version mit Jenkins baue und diese dann aus den Jars starte, bekomme ich eine NoSuchBeanDefinitionException.
Er kann die angegebene Bean also nicht finden.

Ich habe Klassen, welche mit @Component gekennzeichnet sind, und welche per @Autowired instanziiert werden.
Schon beim instanziieren der ersten Bean im ApplicationContext gibts die Exception.

Ich kann leider nur code-stücke oder Pseudo-Code posten, mehr darf ich nicht.

Der Einstiegspunkt im Programmcode:

Java:
...
GenericApplicationContext context = new GenericApplicationContext();
        XmlBeanDefinitionReader xmlReader = new XmlBeanDefinitionReader(context);
        xmlReader.loadBeanDefinitions(new ClassPathResource("META-INF/ctx.xml"));
        context.refresh();

        mainController = context.getBean("MainController");
        ....


Beispiel des MainControllers:

Java:
@Component("MainController")
public class MainController implements Observer {

    @Autowired
    private MainModel          model;
...
}


Die ctx.xml:
[XML]<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
Index of /schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
Index of /schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
Index of /schema/context
http://www.springframework.org/schema/context/spring-context.xsd">


<context:component-scan base-package="package.package2"/>


</beans>[/XML]
Die mit @Component annotierten Klassen sind alle in verschiedenen Packages unter package2.

Teile des Quellcodes werden obfuscated, die Klassen die mit @Component gekennzeichnet sind, werden von der obfuscation ausgeschlossen. Hab das in der erstellten Jar schon überprüft.
Hab ich vielleicht noch irgendwas vergessen? Ich versteh einfach nicht, warum es aus Eclipse heraus läuft, aber nicht aus den JARs.

Hat jemand vielleicht ne Idee, woran das liegen könnte?
 

Boiorix

Mitglied
Die Vermutung liegt wohl nahe, dass es am Obfuscator liegt.

Dein Pseudocode funktioniert bei mir wie erwartet.

Du hast mit deiner Vermutung richtig gelegen!
ProGuard optimiert noch den ganzen Quellcode und schmeisst Annotations raus!!!
Annotations müssen wie folgend in der Proguard-Config eingetragen werden:

Code:
-keepattributes *Annotation*
-keepdirectories

-keep @org.springframework.beans.factory.annotation.Component class *
-keepclassmembers class * { @org.springframework.beans.factory.annotation.Autowired *; }

So bleiben jetzt die Annotationen @Component und @Autowired beibehalten.
Ob keepAttributes und -keepdirectories zwingend notwendig sind, weiss ich jetzt nicht.
Denn wirklich funktioniert hat das ganze erst, mit dem Einfügen der anderen 2 Zeilen.
 

Ähnliche Java Themen

Neue Themen


Oben