Исключение ClassFormatError после добавления зависимости javaee-web-api - PullRequest
2 голосов
/ 17 октября 2011

я хочу использовать EL 2.2 с tomcat 7 , поэтому я добавил в свой файл pom следующую зависимость:

   <dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-web-api</artifactId>
    <version>6.0</version>
    <scope>provided</scope>
   </dependency>

, но после добавления яя получаю следующее исключение с hibernate:

ERROR [main] (DefaultSingletonBeanRegistry.java:490) - Destroy method on bean with name 'dataSource' threw an exception
java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/persistence/TransactionRequiredException
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
        at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessBeforeDestruction(PersistenceAnnotationBeanPostProcessor.java:356)
        at org.springframework.beans.factory.support.DisposableBeanAdapter.destroy(DisposableBeanAdapter.java:166)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroyBean(DefaultSingletonBeanRegistry.java:487)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingleton(DefaultSingletonBeanRegistry.java:463)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.destroySingletons(DefaultSingletonBeanRegistry.java:431)
        at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1048)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:433)
        at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:84)
        at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
        at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:280)
        at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:304)
        at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
        at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
        at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:321)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:220)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:301)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:303)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
        at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
        at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
        at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
        at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
        at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345)
        at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009)

все работало нормально, прежде чем я добавил эту зависимость, я думаю, что она конфликтует с другими зависимостями, может быть, я не знаю, как вы думаете, ребята?

Ответы [ 2 ]

2 голосов
/ 18 октября 2011

Как отметил BalusC, Tomcat не соответствует веб-профилю.Таким образом, вы не можете просто иметь область действия provided.

Вы можете проверить недавно выпущенный TomEE , который является контейнером, совместимым с веб-профилем, и использует tomcat.

Похоже, что исключение в вашем случае связано с JPA - убедитесь, что с вашими зависимостями JPA все в порядке (например, убедитесь, что у вас нет ни 1.0, ни 2.0 на пути к классам).И еще одна вещь - для использования EL вам не нужно добавлять зависимость.Включено в Tomcat.

2 голосов
/ 17 октября 2011

Что касается вопроса, если вы сделаете это с Tomcat, просто проверьте комментарий от BalusC.

Причина, по которой вы видите эту трассировку стека, заключается в том, что то, что вы получаете с зависимостью javaee-web-api, является своего рода каркасом, с которым вы можете компилировать (просто общедоступный интерфейс).За этим нет никакой реальной реализации.Вот как, например, класс, который вы пытаетесь использовать, выглядит через javap -c TransactionRequiredException

Compiled from "TransactionRequiredException.java"
public class javax.persistence.TransactionRequiredException extends javax.persistence.PersistenceException{
public javax.persistence.TransactionRequiredException();

public javax.persistence.TransactionRequiredException(java.lang.String);

}

Кроме того, в любом классе, найденном из * 1009, нет никаких инструкций возврата.* файл.Вы можете прочитать другие эксперименты с библиотекой такого типа из

Вызов любого метода или конструкторадля этих классов не получится.Это означает, что вы, вероятно, никогда не должны использовать во время выполнения ничего, что происходит из этой зависимости.

  • не для модульных тестов
  • не для какого-то поколения Hibernate
  • и т. Д.

До того, как вы использовали реальную реализацию javax.persistence.TransactionRequiredException во время ваших юнит-тестов, теперь это пустая оболочка от новой зависимости.

...