我有一个示例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>
答案 0 :(得分: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>
如果您没有下载/指定包含在您的应用中的jar,您显然必须立即添加它并且您已完成。
通常你认为你在课程中有它,但由于某种原因你不能。
在这种情况下,首先让你获得类路径。根据您的环境,这可能很棘手。在简单的桌面应用程序中,您可以使用系统属性java.class.path
。在应用程序服务器和类似环境中,这有点复杂。您可能必须调试类加载器,以查找它们实际查找的位置。通常你可以通过使用你假设使用的类路径来缩短这一步骤,但是如果有问题的类在假定的类路径中并且仍然没有显示,则此步骤将有所帮助。
确保您的jar真的被添加到类路径中。还要注意微小的差异。有些lib已经更改了它们的包名,所以jar的错误版本可能有一个类非常类似于你要加载的类,但只是在错误的包中。