Java Google Web Toolkit运行时错误:方法中缺少非本机或抽象的代码属性
我正在做我在GWT的第一步,我被各种可能性所吸引 到目前为止,我已经建立了一个依赖于外部库中提供的java类的小项目。这个库通过maven(自己的存储库)提供给我的项目。 我想在客户端使用该库中的Java类——因此我必须在jar中提供源代码,并且必须确保这些类不使用不可翻译为Javascript的代码 到目前为止还不错。我终于克服了找不到源代码的错误。。现在,在web应用程序运行时出现一个新错误:Java Google Web Toolkit运行时错误:方法中缺少非本机或抽象的代码属性,java,javascript,gwt,Java,Javascript,Gwt,我正在做我在GWT的第一步,我被各种可能性所吸引 到目前为止,我已经建立了一个依赖于外部库中提供的java类的小项目。这个库通过maven(自己的存储库)提供给我的项目。 我想在客户端使用该库中的Java类——因此我必须在jar中提供源代码,并且必须确保这些类不使用不可翻译为Javascript的代码 到目前为止还不错。我终于克服了找不到源代码的错误。。现在,在web应用程序运行时出现一个新错误: java.lang.ClassFormatError: Absent Code attribute
java.lang.ClassFormatError: Absent
Code attribute in method that is not
native or abstract in class file
javax/persistence/LockModeType
at java.lang.ClassLoader.defineClass1(Native
Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
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:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
at java.lang.Class.getDeclaredMethods0(Native
Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getMethod0(Class.java:2670)
at java.lang.Class.getMethod(Class.java:1603)
at com.google.gwt.dev.javac.TypeOracleMediator.createAnnotation(TypeOracleMediator.java:463)
at com.google.gwt.dev.javac.TypeOracleMediator.resolveAnnotationValue(TypeOracleMediator.java:725)
at com.google.gwt.dev.javac.TypeOracleMediator.resolveAnnotationValue(TypeOracleMediator.java:681)
at com.google.gwt.dev.javac.TypeOracleMediator.createAnnotation(TypeOracleMediator.java:474)
at com.google.gwt.dev.javac.TypeOracleMediator.resolveAnnotation(TypeOracleMediator.java:640)
at com.google.gwt.dev.javac.TypeOracleMediator.resolveAnnotations(TypeOracleMediator.java:655)
at com.google.gwt.dev.javac.TypeOracleMediator.resolveClass(TypeOracleMediator.java:801)
at com.google.gwt.dev.javac.TypeOracleMediator.addNewTypes(TypeOracleMediator.java:416)
at com.google.gwt.dev.javac.TypeOracleMediatorFromSource.addNewUnits(TypeOracleMediatorFromSource.java:54)
at com.google.gwt.dev.javac.CompilationState.assimilateUnits(CompilationState.java:164)
at com.google.gwt.dev.javac.CompilationState.<init>(CompilationState.java:82)
at com.google.gwt.dev.javac.CompilationStateBuilder.doBuildFrom(CompilationStateBuilder.java:409)
at com.google.gwt.dev.javac.CompilationStateBuilder.buildFrom(CompilationStateBuilder.java:299)
at com.google.gwt.dev.cfg.ModuleDef.getCompilationState(ModuleDef.java:325)
at com.google.gwt.dev.DevModeBase$UiBrowserWidgetHostImpl.createModuleSpaceHost(DevModeBase.java:105)
at com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:190)
at com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:510)
at com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)
at java.lang.Thread.run(Thread.java:680)
java.lang.ClassFormatError:不存在
方法中的代码属性不是
类文件中的本机或抽象
javax/persistence/LockModeType
位于java.lang.ClassLoader.defineClass1(本机
(方法)
位于java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
位于java.lang.ClassLoader.defineClass(ClassLoader.java:616)
位于java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
位于java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
在java.net.URLClassLoader.access$000(URLClassLoader.java:58)
在java.net.URLClassLoader$1.run(URLClassLoader.java:197)
位于java.security.AccessController.doPrivileged(本机
(方法)
位于java.net.URLClassLoader.findClass(URLClassLoader.java:190)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:307)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:248)
位于java.lang.Class.getDeclaredMethods0(本机
(方法)
位于java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
位于java.lang.Class.getMethod0(Class.java:2670)
位于java.lang.Class.getMethod(Class.java:1603)
在com.google.gwt.dev.javac.TypeOracleMediator.createAnnotation(TypeOracleMediator.java:463)上
位于com.google.gwt.dev.javac.TypeOracleMediator.resolveAnnotationValue(TypeOracleMediator.java:725)
位于com.google.gwt.dev.javac.TypeOracleMediator.resolveAnnotationValue(TypeOracleMediator.java:681)
在com.google.gwt.dev.javac.TypeOracleMediator.createAnnotation(TypeOracleMediator.java:474)上
位于com.google.gwt.dev.javac.TypeOracleMediator.resolveAnnotation(TypeOracleMediator.java:640)
位于com.google.gwt.dev.javac.TypeOracleMediator.resolveAnnotations(TypeOracleMediator.java:655)
位于com.google.gwt.dev.javac.TypeOracleMediator.resolveClass(TypeOracleMediator.java:801)
在com.google.gwt.dev.javac.TypeOracleMediator.addNewTypes(TypeOracleMediator.java:416)
位于com.google.gwt.dev.javac.TypeOracleMediatorFromSource.addNewUnits(TypeOracleMediatorFromSource.java:54)
在com.google.gwt.dev.javac.CompilationState.assimilateUnits上(CompilationState.java:164)
位于com.google.gwt.dev.javac.CompilationState.(CompilationState.java:82)
位于com.google.gwt.dev.javac.CompilationStateBuilder.doBuildFrom(CompilationStateBuilder.java:409)
在com.google.gwt.dev.javac.CompilationStateBuilder.buildFrom上(CompilationStateBuilder.java:299)
在com.google.gwt.dev.cfg.ModuleDef.getCompilationState上(ModuleDef.java:325)
位于com.google.gwt.dev.DevModeBase$UiBrowserWidgetHostImpl.createModuleSpaceHost(DevModeBase.java:105)
位于com.google.gwt.dev.shell.OophmSessionHandler.loadModule(OophmSessionHandler.java:190)
位于com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelServer.java:510)
在com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:352)
运行(Thread.java:680)
我使用Eclipse(Helios)和EclipseGWT插件。Web应用程序由内部应用程序服务器托管。JDK在MacOSX上是1.6。
对此有什么想法吗?JDK不包括
javax.persistence
包的实现——它是JavaEE的一部分。即使是这样,您也不应该在客户端包含SQL相关库—您的GWT应用程序无法直接查询SQL server。javaee api是精简的代码。i、 e.从类中删除实际逻辑字节码。它与GWT的关系不太好
对于Java EE 6,替换为:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
爪哇
JavaEEAPI
6
假如
与:
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-ejb_3.1_spec</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jpa_2.0_spec</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
org.apache.geronimo.specs
geronimo-ejb_3.1_规范
1
假如
org.apache.geronimo.specs
geronimo-jpa_2.0_规范
1
假如
不会影响您的部署,因为它是提供的。我将总结有关此错误的经验,以帮助他人(并澄清一些场景) 作为@Tom,我使用eclipse和GWT插件(这意味着我倾向于左键单击我的项目>运行方式>Web应用程序,以便运行/测试我的Web应用程序) 此外,我的项目基于maven,因此我的GWT项目是使用maven GWT插件提供的maven原型创建的:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
...
</plugin>
org.codehaus.mojo
),插件生成的项目与GWT Eclipse插件完美集成;这是真的
但是,如果您的客户机代码(翻译为javascript的java代码)包含JPA注释(例如域对象),您将在各种情况下遇到一些错误(这里我假设您使用的是maven,但结论也可以应用于常规项目):
场景一(编译错误):您将无法编译GWT应用程序,因为编译器会抱怨不知道这些注释。如果您使用的是maven,则可以使用依赖项解决此问题:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
爪哇
JavaEEAPI
6
假如
场景二(代码可以编译,但在devmode上运行应用程序时会出现“缺勤属性…”错误):正如@rjdkolb指出的,问题在于javaee api依赖项是一个剥离的代码。。。因此,为了消除错误,您应该用一个完整的imple替换该依赖项
<dependency>
<groupId>org.jboss</groupId>
<artifactId>ejb3-persistence</artifactId>
<version>5.1.0.GA</version>
<scope>provided</scope>
</dependency>