dropwizard异常:java.lang.NoClassDefFoundError

时间:2015-06-17 19:42:11

标签: java hibernate dropwizard

我有一个示例dropwizard应用程序。我得到以下例外:

>java -jar target/order-service-1.0.0-SNAPSHOT.jar

Exception in thread "main" java.lang.NoClassDefFoundError: org/hibernate/engine/jdbc/connections/spi/ConnectionProvider
    at io.dropwizard.hibernate.HibernateBundle.<init>(HibernateBundle.java:20)
    at com.blurb.order.OrderApplication$1.<init>(OrderApplication.java:61)
    at com.blurb.order.OrderApplication.<init>(OrderApplication.java:52)
    at com.blurb.order.OrderApplication.main(OrderApplication.java:133)
Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.jdbc.connections.spi.ConnectionProvider
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 4 more

如何解决此异常?

修改

以下是maven shade插件的配置:

<plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>1.6</version>
                <configuration>
                    <createDependencyReducedPom>true</createDependencyReducedPom>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.*.order.OrderApplication</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>

1 个答案:

答案 0 :(得分:1)

解决此类问题的方法如下:

  1. 找出缺少的类(在这种情况下:org / hibernate / engine / jdbc / connections / spi / ConnectionProvider)应该在哪里。通常您可以从包名称中分辨出来。这个似乎来自hibernate,所有专门的,找到这个类服务的jar让我失望了,但谷歌搜索出现了这个:https://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/engine/jdbc/connections/spi/class-use/ConnectionProvider.html,所以你应该检查这个类的hibernate - * .jar。 / p>

  2. 如果您没有下载/指定包含在您的应用中的jar,您显然必须立即添加它并且您已完成。

  3. 通常你认为你在课程中有它,但由于某种原因你不能。 在这种情况下,首先让你获得类路径。根据您的环境,这可能很棘手。在简单的桌面应用程序中,您可以使用系统属性java.class.path。在应用程序服务器和类似环境中,这有点复杂。您可能必须调试类加载器,以查找它们实际查找的位置。通常你可以通过使用你假设使用的类路径来缩短这一步骤,但是如果有问题的类在假定的类路径中并且仍然没有显示,则此步骤将有所帮助。

  4. 确保您的jar真的被添加到类路径中。还要注意微小的差异。有些lib已经更改了它们的包名,所以jar的错误版本可能有一个类非常类似于你要加载的类,但只是在错误的包中。