我正在尝试使用Java 7和Tomcat 7构建JSF / Hibernate应用程序。我已经安装了Java SDK和JavaEE SDK,并将javaee.jar和javaee-api-6.jar复制到我的Tomcat LIB中夹。根据我对this post和this post的理解,我应该拥有我需要的所有罐子,据我所知,我在这个文件夹中没有其他罐子,这些罐子有相互冲突的资源。
javaee.jar文件包含看起来像Maven pom文件的内容,没有别的。我不确定它的价值是什么。
我的javaee-api-6 jar大小约为950k,包含了我期望的所有.class文件。我正在使用的代码编译得很好,我只在尝试部署到Tomcat时看到错误。这些罐子是从玻璃鱼装置中取出的。 奇怪的是文件ServletException.class文件只有366个字节。
我在Eclipse中设置了Tomcat,以便IDE在部署时“接管”Tomcat,而不是部署到某个插件文件夹(默认行为)。
我正在使用的唯一相关软件包是来自javax.persistence的'Entity''Id'和'GeneratedValue'。
我尝试过只使用javaee-api-6.jar
并重命名为javaee-api.jar
和javaee.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)
答案 0 :(得分:6)
我需要在Tomcat 7中包含哪些内容才能使javax.persistence正常工作?
不是从Oracle下载的Java EE SDK。它基本上包含Oracle Glassfish服务器。您似乎误解了Java EE究竟是什么。
我强烈建议您在尝试将其变为Glassfish服务器时撤消在Tomcat中所做的所有更改。或者,更好,从头开始重启。
您应该选择具体的JPA实现并安装它。有几个:
每个都附带下载链接和体面的文档。 Hibernate是最受欢迎的。 EclipseLink是参考实现(因此在Glassfish的封面下使用)。 OpenJPA只是Apache Software Foundation的另一个。最终,在webapp的/WEB-INF/lib
中删除具体JPA实现的JAR文件(因此不是Tomcat的/lib
)。