Jef*_*and 2 netbeans hibernate glassfish java-ee ejb-3.0
我把Hibernate库放在Glassfish域和Netbeans中项目的库集合中.hibernate-entitymanager.jar包含HibernatePersistence(调用堆栈中的最后一个类)和Ejb3Configuration,所以我很难过为什么我得到了Ejb3Configuration缺少的类错误.
java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.ejb.Ejb3Configuration
at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:130)
at com.sun.enterprise.server.PersistenceUnitLoaderImpl.load(PersistenceUnitLoaderImpl.java:149)
at com.sun.enterprise.server.PersistenceUnitLoaderImpl.load(PersistenceUnitLoaderImpl.java:84)
...
Run Code Online (Sandbox Code Playgroud)
我之前从未见过这个特定的错误消息,但我可以解释它的含义并给出一个可能的原因.
这条线
java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.ejb.Ejb3Configuration
并不意味着JVM找不到类org.hibernate.ejb.Ejb3Configuration.这意味着JVM可以找到这个类但它已经尝试过并且无法加载这个类.
这Could not initialize class ...是表明发生这种情况的文本.如果JVM根本找不到类,你会得到类似下面的内容:
java.lang.NoClassDefFoundError: org/hibernate/ejb/Ejb3Configuration
顺便说一句,这也意味着你正在使用Java 6 - 在Java 5中相应的异常没有消息.
以下两个类提供了此行为的演示.Unloadable无法加载该类,因为其静态初始化程序始终会引发异常.我们尝试加载此类,捕获该ExceptionInInitializerError结果,并尝试Unloadable再次加载.
class Unloadable {
static {
if (true) { throw new RuntimeException(); }
}
}
public class LoadingTest {
public static void main(String[] args) throws Exception {
try {
Class.forName("Unloadable");
}
catch (ExceptionInInitializerError e) {
try {
Class.forName("Unloadable");
}
catch (NoClassDefFoundError e2) {
System.out.println("XXXXXXXXXXXXXXXXXXXXX");
e2.printStackTrace(System.out);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行类时LoadingTest,我得到以下输出:
XXXXXXXXXXXXXXXXXXXXX
java.lang.NoClassDefFoundError: Could not initialize class Unloadable
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
at LoadingTest.main(LoadingTest.java:14)
我不能说导致原始尝试加载org.hibernate.ejb.Ejb3Configuration失败的原因.很可能Ejb3Configuration本身依赖于类路径中缺少的类.可能值得浏览Ejb3Configurationimport编辑的所有类的列表,并确保所有那些不在Glassfish和Netbeans可以看到的JAR中或在其中的人.java.*javax.*
此外,我只能推测JVM为什么要尝试加载Ejb3Configuration 两次.当类加载第一次失败时,抛出异常(通常是某些子类LinkageError).这种类型的异常通常不会被捕获,因此我最好的猜测是发生以下情况:
try {
// Some code that loads Ejb3Configuration and fails.
}
finally {
// Some code that also loads Ejb3Configuration and fails.
}
Run Code Online (Sandbox Code Playgroud)
如果finally块中的代码抛出异常,则此异常将替换块中抛出的任何异常try.我建议这是因为在这个问题上发生了类似的事情.此问题中发布的堆栈跟踪来自一个finally块内.
如果我的回答仍然没有帮助你,你能否发布你看到的整个堆栈跟踪?
| 归档时间: |
|
| 查看次数: |
9948 次 |
| 最近记录: |