NoClassDefFoundError:使用spring的DataAccessException

时间:2015-09-01 12:21:47

标签: java spring maven

我知道这已经讨论了很多,但不知道以前提出的问题都不适用于我的案例。 加载我的应用程序时,我得到以下stacktrace:

//Controller-Action
$releaseQuery = new Query();
    $releaseQuery->
    select("`amount` AS 'Amount', 
            `created` AS 'Created',
            `user`.`email` AS 'User',
            `cinema`.`name` AS 'Cinema',
            `date` AS 'Date'")->
    from("`release`")->
        join('left join', '`user`', '`release`.`created_by` = `user`.`id`')->
        join('left join', '`cinema`', '`release`.`cinemaid` = `cinema`.`id`');
    $dataProvider = new ActiveDataProvider([
        'query' => $releaseQuery,
        'pagination' => [
            'pageSize' => 50,
        ],
    ]);

// View
<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            'Amount:currency',
            'Created',
            'User',
            'Cinema',
            'Date',
        ],
    ]) ?>

在大多数关于类似错误的线索中,人们确实错过了我绝对不会使用的spring-tx jar。 它在我的maven依赖项中与其他需要的弹簧罐一起声明:

Exception in thread "JavaFX Application Thread" java.lang.NoClassDefFoundError: org/springframework/dao/DataAccessException
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2663)
at java.lang.Class.getConstructor0(Class.java:3067)
at java.lang.Class.newInstance(Class.java:408)
at sun.reflect.misc.ReflectUtil.newInstance(ReflectUtil.java:51)
at javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:923)
at javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:967)
at javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:216)
at javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:740)
at javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2701)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2521)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2435)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2403)
at de.festo.rs.windows.FXApplStarter$1.run(FXApplStarter.java:29)
at com.sun.javafx.application.PlatformImpl.lambda$null$164(PlatformImpl.java:292)
at com.sun.javafx.application.PlatformImpl$$Lambda$55/29905907.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$165(PlatformImpl.java:291)
at com.sun.javafx.application.PlatformImpl$$Lambda$54/20965065.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$141(WinApplication.java:102)
at com.sun.glass.ui.win.WinApplication$$Lambda$46/6575340.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.springframework.dao.DataAccessException
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 24 more

在调查我的部署输出时,罐子也在那里。 然而,抛出了所提到的错误。我真的非常绝望。 请注意,该应用程序不是WebApp,而是从另一个程序加载的独立应用程序。

有趣的是,我的同事无法重现错误。出于这个原因,我猜我的JavaFX加载器将spring-jdbc查询的结果加载到其数据模型中是一种竞争条件。我没有任何证据,这只是一种直觉。 任何帮助或tipp将非常感激。 如果需要进一步的信息,请告诉我。

3 个答案:

答案 0 :(得分:3)

解决这个问题我刚刚在基础包下移动了application.java,就像我创建了groupid demo.test.activemq并在src文件夹中创建了相同的包名,然后重新启动。它对我有用。

答案 1 :(得分:1)

类:org.springframework.dao.DataAccessException在Spring-DAO中定义。检查是否具有以下依赖性。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-dao</artifactId>
    <version>2.0.8</version>
</dependency>

答案 2 :(得分:0)

另一种可能性是,您可以通过 scope 来隐藏一些依赖项,例如test:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <scope>test</scope>
    </dependency>

只需删除范围(或设置默认范围:编译)