0

我正在尝试使用 Java 7 和 Tomcat 7 构建 JSF/Hibernate 应用程序。我已经安装了 Java SDK 和 JavaEE SDK,并将 javaee.jar 和 javaee-api-6.jar 复制到我的 Tomcat LIB 文件夹中。根据我对这篇文章这篇文章的理解,我应该拥有我需要的所有 jar,并且据我所知,我在此文件夹中没有其他资源冲突的 jar。

  • javaee.jar 文件包含看起来像 Maven pom 文件的内容,仅此而已。我不确定它的价值是什么。

  • 我的 javaee-api-6 jar 大小约为 950k,包含我期望的所有 .class 文件。我使用的代码编译得很好,我在尝试部署到 Tomcat 时只看到一个错误。这些罐子取自 glassfish 装置。奇怪的是 ServletException.class 文件只有 366 个字节。

  • 我在 Eclipse 中设置了 Tomcat,以便 IDE 在部署时“接管”Tomcat,而不是部署到某个插件文件夹(默认行为)。

  • 到目前为止,我使用的唯一相关包是 javax.persistence 中的“Entity”“Id”和“GeneratedValue”。

  • 我试过只使用并重javaee-api-6.jar命名它javaee-api.jarjavaee.jar没有任何变化。看起来文件名并不重要。

对 Glassfish lib 文件夹的深入检查确实显示了许多相关的 jar,但不是完整的 javaee 包,所以我无法将 Javaee-api-6.jar 移出并移入,它们不完整,我得到了一个类似的错误表明(我假设)找不到某个类的实现。

所以我的问题是:我需要在 Tomcat 7 中包含什么才能使 javax.persistence 正常工作?

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/servlet/ServletException
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.privateGetPublicMethods(Unknown Source)
at java.lang.Class.privateGetPublicMethods(Unknown Source)
at java.lang.Class.privateGetPublicMethods(Unknown Source)
at java.lang.Class.getMethods(Unknown Source)
at org.apache.tomcat.util.IntrospectionUtils.findMethods(IntrospectionUtils.java:713)
at org.apache.tomcat.util.IntrospectionUtils.setProperty(IntrospectionUtils.java:272)
at org.apache.tomcat.util.IntrospectionUtils.setProperty(IntrospectionUtils.java:261)
at org.apache.tomcat.util.digester.SetPropertiesRule.begin(SetPropertiesRule.java:215)
at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1282)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1543)
at org.apache.catalina.startup.Catalina.load(Catalina.java:554)
at org.apache.catalina.startup.Catalina.load(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:262)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:430)
4

1 回答 1

6

我需要在 Tomcat 7 中包含什么才能使 javax.persistence 正常工作?

不是从 Oracle 下载的 Java EE SDK。它基本上包含 Oracle Glassfish 服务器。您似乎误解了 Java EE 到底是什么。

我强烈建议您在尝试将 Tomcat 变形为 Glassfish 服务器时撤消您在 Tomcat 中所做的所有更改。或者,更好的是,从头开始。

您应该选择具体的 JPA 实现并安装它。有几个:

每个都带有一个下载链接和体面的文档。休眠是最流行的。EclipseLink 是参考实现(因此在 Glassfish 的封面下使用)。OpenJPA 只是来自 Apache Software Foundation 的另一个。最终,将具体 JPA 实现的 JAR 文件放入/WEB-INF/libwebapp(因此不是 Tomcat 的/lib)。

于 2012-06-11T03:32:21.760 回答