Upgrade-Spring Security-2.5 3.1 - java.lang.NoClassDefFoundError: org/springframework/Sicherheit/Authentifizierung

Dieses problem erweist sich als sehr schwierig zu beheben. Übliche Geschichte, vererbt eine sehr schlecht gepflegt und java-web-Anwendung mit keine unit-tests und eine Vielzahl von alten jar-Abhängigkeiten mit keine version info gedumpten in ein lib-Verzeichnis erstellt unter Verwendung von Ant. Um eine bessere Wartung und das Verständnis für die Abhängigkeiten wanderte ich über Maven. Später erkannte ich, dass die version von Frühling war schon ziemlich alt (Frühjahr 2.x und Spring Security 2.0.3). Ich habe ein Upgrade erfolgreich in Spring 2.5. Ich habe jetzt angefangen die Migration von Frühling bis 3.1.2.RELEASE, und Spring Security bis zu 3.1.3.RELEASE.

Alles kompiliert, ich don ' T get any namespace Probleme entweder (deklariert in der Header Spring-XML-configs), aber schlägt fehl, wenn die Anwendung als war-Datei in den Tomcat-Container. Die log-Datei meldet:

Could not instantiate bean class [com.mydomain.repository.ReportDaoImpl]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/springframework/security/Authentication
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:997)

Habe ich geprüft, und org.springframework.Sicherheit.Authentifizierung gehört zu den alten Feder-Sicherheits-Glas (2.0.4)

Meine aktuellen Maven-Abhängigkeiten sind wie folgt:

<spring.version>3.1.2.RELEASE</spring.version>

      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <!--  SPRING SECURITY -->

             <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-acl</artifactId>
        <version>3.1.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>3.1.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-core</artifactId>
        <version>3.1.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-taglibs</artifactId>
        <version>3.1.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>3.1.3.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-crypto</artifactId>
        <version>3.1.3.RELEASE</version>
    </dependency>

Meine security.xml minimal:

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"
  xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security-3.1.xsd">

<http auto-config='true'>
    <intercept-url pattern="/**" access="ROLE_Admin" />
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="admin" password="password" authorities="ROLE_Admin" />
        </user-service>
    </authentication-provider>
</authentication-manager>        

Alle meine anderen Spring Config-Dateien verwenden Sie die folgenden namespace-Header in Ihre configs:

<?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:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

Soweit ich weiß ist diese Anwendung enthält KEINE Anmerkungen in Bezug auf Frühling.

Also, wie funktioniert der Spring Security 2.0.4-Klasse org.springframework.Sicherheit.Authentifizierung erhalten angefordert, die durch eine Feder 3.1-Klasse org.springframework.Bohnen.factory.Unterstützung.AbstractAutowireCapableBeanFactory bei der Instanziierung ein DAO-Objekt (das hat nichts zu tun mit Spring security-Einstellungen). Kann es sein, dass die DAO abgeholt wird, denn es ist die erste Bohne, um zu bekommen, instanziiert in der applicationContext.xml durch den classloader (per Spring dependency-injection-container), aber ich sehe nicht, wie es ist immer noch eine Referenz lauern irgendwo in dieser Anwendung zu einem alten 2.0.4-Klasse. Da alles kompiliert ok, und die Maven-pom nur Referenzen 3.1 mein nehmen ist, dass es einige Konfiguration irgendwo noch versuchen, ziehen in eine alte Klasse. Wer mit Spring Security Kenntnisse (insbesondere Modernisierung eine große app von version 2 auf version 3) getroffen haben könnte, dieses problem vor, aber ich konnte nicht finden die exakte übereinstimmung über google. Vielen Dank für alle Vorschläge auf dieser. Derzeit ratlos.

Kurzes update:

Den applicationContext.xml hat den namespace-header wie oben angegeben und das DAO ist einfach verwiesen wird, wie folgt:

<bean id="reportDao" class="com.mydomain.repository.ReportDaoImpl">
    <property name="dataSource" ref="myDataSource" />
</bean>

Es ist wirklich nichts mehr drin. Die Datei ApplicationContext zieht in einem anderen Kontext-Datei Datei ApplicationContext-Datenquelle, die erklärt (gleiche namespace-header wieder wie oben):

 <bean id="parentDataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
</bean>

<bean id="myDataSource" parent="parentDataSource">
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

Den ReportDao ist über 1500 Zeilen schlecht geschrieben prozeduralen code. Es ist ein POJO und implementiert rg.springframework.Kontext.ApplicationContextAware. Es verwendet auch die org.springframework.jdbc.core.Unterstützung.JdbcDaoSupport für die Durchführung von CRUD-Operationen auf der Datenbank.

Läuft mvn -X die Ausgabe für Abhängigkeiten (geschaltet haben, Frühling [main] 3.0.7):

   org.springframework:spring-webmvc:jar:3.0.7.RELEASE:compile
    org.springframework:spring-asm:jar:3.0.7.RELEASE:compile
    org.springframework:spring-beans:jar:3.0.7.RELEASE:compile
    org.springframework:spring-expression:jar:3.0.7.RELEASE:compile
    org.springframework:spring-web:jar:3.0.7.RELEASE:compile
 org.springframework:spring-aop:jar:3.0.7.RELEASE:compile
    aopalliance:aopalliance:jar:1.0:compile
 org.springframework:spring-context:jar:3.0.7.RELEASE:compile
 org.springframework:spring-context-support:jar:3.0.7.RELEASE:compile
 org.springframework:spring-core:jar:3.0.7.RELEASE:compile
 org.springframework:spring-tx:jar:3.0.7.RELEASE:compile
 org.springframework:spring-jdbc:jar:3.0.7.RELEASE:compile
 org.springframework.security:spring-security-acl:jar:3.1.3.RELEASE:compile
 org.springframework.security:spring-security-config:jar:3.1.3.RELEASE:compile
 org.springframework.security:spring-security-core:jar:3.1.3.RELEASE:compile
 org.springframework.security:spring-security-taglibs:jar:3.1.3.RELEASE:compile
 org.springframework.security:spring-security-web:jar:3.1.3.RELEASE:compile
 org.springframework.security:spring-security-crypto:jar:3.1.3.RELEASE:compile

Sieht ok glaube ich.

Nur die spring jars (grep um sicher zu sein) in das WEB-INF/lib-Verzeichnis der lieferbar war-Datei sind:

./spring-aop-3.0.7.RELEASE.jar
./spring-asm-3.0.7.RELEASE.jar
./spring-beans-3.0.7.RELEASE.jar
./spring-context-3.0.7.RELEASE.jar
./spring-context-support-3.0.7.RELEASE.jar
./spring-core-3.0.7.RELEASE.jar
./spring-expression-3.0.7.RELEASE.jar
./spring-jdbc-3.0.7.RELEASE.jar
./spring-security-acl-3.1.3.RELEASE.jar
./spring-security-config-3.1.3.RELEASE.jar
./spring-security-core-3.1.3.RELEASE.jar
./spring-security-crypto-3.1.3.RELEASE.jar
./spring-security-taglibs-3.1.3.RELEASE.jar
./spring-security-web-3.1.3.RELEASE.jar
./spring-tx-3.0.7.RELEASE.jar
./spring-web-3.0.7.RELEASE.jar
./spring-webmvc-3.0.7.RELEASE.jar

Wieder, sieht sinnvoll.

Grepping der source-code für die "Authentifizierung" nicht helfen. Das sieht aus wie eine transitive runtime-dependency Problem. Es geht bei der Kompilierung und nicht erklärt, überall als erste Stufe der Abhängigkeit. Aber irgendwie zur Laufzeit (in der Tomcat-6-container) wenn Sie eingesetzt werden, ein Schelm Verweis auf eine alte Bibliothek-Datei angefordert wird.

Löschen meiner Tomcat-Instanz und von vorne zu beginnen, nur als Vorsichtsmaßnahme.

  • Kannst du die Klasse des ReportDaoImpl ? Dies scheint ein Problem zu sein in der autowiring dieser Klasse. außerdem, wie ist Ihre autowiring ausgelöst in der spring config ?
  • Es ist kein autowiring. Es ist old-school-XML-config. In der einschlägigen Teile von oben, wie ein update. Die applicationConfig wird gezogen, indem der Behälter über web.xml (wie ich bin sicher, Sie sind vertraut mit).
  • Ich würde überprüfen Sie Ihre klassenpfade (beide compile-und Laufzeit), da maven poms sind selten ein dauermarken-Anweisung, was Sie am Ende mit. Führen Sie "mvn -X" und überprüfen Sie die Gläser, die aufgelistet sind absolut sicher, Sie sind nicht kompilieren gegen 2.0.x-Gläsern. Auch grep Ihre java-Quellcode für die "Authentifizierung" und "org.springframework.Sicherheit" und überprüfen Sie die Pakete korrekt sind, in jedem code, der verwendet Spring Security-Klassen.
  • Taylor ich Danke Ihnen sehr für Ihre Zeit. Große Rahmen, die Sie geschrieben haben, und appeciate Ihrer geschätzten input. Ich habe bereits geprüft, die für die Authentifizierung. Ich habe nur die Referenz org.springframework.Sicherheit.core.Authentifizierung in meine importiert. Sie haben völlig Recht über den Wechsel auf mvn -X um sicher zu sein. Überprüfen das jetzt. Nur ein bisschen mehr info. Ich habe die Spring security 3.1.3 Beispiel-app, und hatte einen Blick auf, wie die Kontakte, die Probe eingerichtet worden. Es verwendet, Frühling (main) 3.0.7 mit Spring Security 3.1.3
  • So habe ich verändert mein Frühling (main) auf 3.0.7. Jetzt das problem die änderungen zu java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory ich bin über das in pom.xml als runtime-Abhängigkeit und sehen, was passiert. Wenn dies löst irgendwelche Hinweise, bitte lassen Sie mich wissen. Nochmals vielen Dank.
  • Ok, zurück zum ur-problem. verschachtelte Ausnahme ist org.springframework.Bohnen.BeanInstantiationException: could not instantiate bean-Klasse [Kom.mydomain.repository.ReportDaoImpl]: Konstruktor warf Ausnahme; nested exception is java.lang.NoClassDefFoundError: org/springframework/Sicherheit/Authentifizierung an org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:964)
  • Sie können Spring 3.1, jedoch müssen Sie explizit hinzufügen von Abhängigkeiten zu Ihrem maven pom zum überschreiben der transitive diejenigen, Spring Security zieht. Immer überprüfen Sie Ihre WEB-INF/lib auf verdächtige Versionen (z.B. Mischung von Spring 3.0.x und Spring 3.1.x) - Gläser und hinzufügen von Abhängigkeiten oder AUSSCHLÜSSE zu Ihrem pom. Oder wechseln Sie zu einem anderen build-Tools wie gradle :).
  • Sind Sie absolut sicher, dass Sie neu kompiliert ReportDaoImpl ?
  • ja, sicher, es kompiliert wird. Noch die überprüfung der option-X die Ausgabe. Zwei kurze Fragen für Sie, wenn Sie nichts dagegen haben. 1) gibt die namespace-header benutzt habe ich für meine applicationContext.xml (da oben in der Frage) Aussehen vernünftig? Ich hatte Probleme versuchen, genaue Referenz .XSDs durch die Versionsnummer so ging es für die mehr Allgemeinen Ansatz (sorry, ich weiß, das ist eher Frühling als Frühling Sicherheitsfrage). 2) Für die Spring version 3.0.7 kann ich noch Folgen Sie Ihren Vorschlag im Kommentar oben bezüglich überschreiben transitive Abhängigkeiten etc oder ist es einfacher, mit 3.0.7? Danke.

InformationsquelleAutor arcseldon | 2013-03-05
Schreibe einen Kommentar