Java,Glassfish JPA:NoClassDefFoundError:javax / persistence / spi / PersistenceUnitInfo(仅JDK6 / 7)

我对Java EE6和Glassfish3相当陌生。 我正在试图build立自己的应用程序,当我得到这个错误。

NoClassDefFoundError:javax / persistence / spi / PersistenceUnitInfo

假设这是一个无知问题,我开始遵循本教程: http : //netbeans.org/kb/docs/javaee/javaee-gettingstarted.html#Exercise_1

我仍然有同样的问题。 确切的迹象是:

注释处理器抛出未捕获的exception。 详细信息请参阅以下堆栈跟踪。 java.lang.NoClassDefFoundError:javax / persistence / spi / PersistenceUnitInfo at org.eclipse.persistence.internal.jpa.modelgen.CanonicalModelProcessor.process(CanonicalModelProcessor.java:350)at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor (JavacProcessingEnvironment.java:793)at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:722)at com.sun.tools.javac.processing.JavacProcessingEnvironment.access $ 1700(JavacProcessingEnvironment.java:97) com.sun.tools.javac.processing.JavacProcessingEnvironment $ Round.run(JavacProcessingEnvironment.java:1029)at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1163)at com.sun.tools .javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1106)at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:824)at com.sun.tools.javac.main.Main.compile (Main.java:417)在com.sun.tools.javac.main.Main.compil e(Main.java:331)at com.sun.tools.javac.main.Main.compile(Main.java:322)at com.sun.tools.javac.Main.compile(Main.java:76)at sun .reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke (Method.java:601)at org.apache.tools.ant.taskdefs.compilers.Javac13.execute(Javac13.java:56)at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1134 )在org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:912)的org.netbeans.modules.java.source.ant.JavacTask.execute(JavacTask.java:144)在org.apache。 tool.ant.UnknownElement.execute(UnknownElement.java:291)at sun.reflect.GeneratedMethodAccessor40.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method。调用(Method.java:601)在org.apache.tools.ant.dispatch.D 在org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)上的org.apache.tools.ant.Task.perform(Task.java:348)处的ispatchUtils.execute(DispatchUtils.java:106) org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)at sun.reflect.GeneratedMethodAccessor40.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang .reflect.Method.invoke(Method.java:601)at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)at org.apache.tools.ant.Task.perform(Task.java :348)at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398)at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)at sun.reflect.GeneratedMethodAccessor40。在org.apache.tools.ant.dispatch.DispatchUtils的java.lang.reflect.Method.invoke(Method.java:601)处的sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)调用(Unknown Source)。执行(DispatchUtil 在org.apache.tools.ant.Task.perform(Task.java:348)org.apache.tools.ant.Target.execute(Target.java:390)org.apache.tools .ant.Target.performTasks(Target.java:411)at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)at org.apache.tools.ant.Project.executeTarget(Project.java:1368 )在org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)在org.apache.tools.ant.Project.executeTargets(Project.java:1251)在org.apache.tools.ant。在org.netbeans.core.execution.RunClassThread的org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:539)处的module.bridge.impl.BridgeImpl.run(BridgeImpl.java:284)。运行(RunClassThread.java:153)导致:java.lang.ClassNotFoundException:在java.net.URLClassLoader的javax.persistence.spi.PersistenceUnitInfo $ 1.run(URLClassLoader.java:366)在java.net.URLClassLoader $ 1.run( URLClassLoader.java:355)在java.net.URLClassLoader.find上的java.security.AccessController.doPrivileged(Native方法) Class(URLClassLoader.java:354)at java.lang.ClassLoader.loadClass(ClassLoader.java:423)at java.lang.ClassLoader.loadClass(ClassLoader.java:356)… 49 more / home / alan / Projects / SimpleEE6App / SimpleEE6App / nbproject / build-impl.xml:550:执行此行时发生以下错误:/home/alan/Projects/SimpleEE6App/SimpleEE6App/nbproject/build-impl.xml:263:编译失败; 详细信息请参阅编译器错误输出。 BUILD FAILED(总时间:0秒)

带有PersistenceUnitInfo.classjavax.persistence.spi jar确实存在于Glassfish服务器3上,我可以通过Netbeans看到它。 显式添加JPA库(EclipseLink,Persistence等)的任何组合都不会阻止错误。
所以我完全停留在这一点上,为什么构build过程找不到合适的类。

有任何想法吗?

更新:我想清楚是什么造成的,但不知道为什么? 在Netbeans-> Project properties-> Libraries-> Processor(tab)中列出了eclipselink(JPA2.0)和EclipseLink-ModelGen(JPA 2.0)。 一旦我删除它的工作。 Netbeans在创build实体时自动添加它们。 我正在运行Netbeans 7.0.1。 感谢大家的帮助。

    根本原因只能是JAR不在可用于运行时抛出异常的进程的类路径中。 当你说JAR“确实存在”时,你可以验证它在类路径上的存在吗? 只是在服务器安装下的文件夹中是不够的。

    如果在Web项目中有WEB-INF目录,则可以尝试将JAR复制到WEB-INF / lib目录,因为该目录中的JAR由servlet规范保证,作为应用程序安装的一部分添加到类路径中。

    您遇到此错误是因为找不到指定的类javax/persistence/spi/PersistenceUnitInfo

    为了得到这个类,你需要在你的类路径中使用javax.persistence.jar文件。 你可以从这里下载