如何解决Google Web Toolkit运行时错误:方法中的代码属性不是本机或抽象的
| 我在GWT中迈出了第一步,并对这种可能性着迷。 到目前为止,我已经建立了一个小项目,该项目依赖于外部库中提供的java类。该库可通过maven(自己的存储库)供我的项目使用。 我想在客户端上使用该库中的java类-因此我必须在jar中提供源代码,并且必须确保这些类不使用无法转换为Javascript的代码。 到目前为止,一切都很好。我终于克服了找不到源代码的错误。现在,在Web应用程序的运行期间出现了一个新错误: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)
我使用Eclipse(Helios)和Eclipse GWT-PLugin。该Web应用程序由内部App Server托管。在Mac OS X上,JDK是1.6。
有什么想法吗?
解决方法
JDK不包含
javax.persistence
包的实现-它是Java EE的一部分。即使这样做,您也不应该在客户端上包含与SQL相关的库-GWT应用程序无法直接查询SQL Server。
, javaee-api是剥离的代码。即实际的逻辑字节代码已从类中删除。与GWT搭配使用效果不佳
对于Java EE 6,替换:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
与:
<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>
由于已提供,因此不会影响您的部署。
, 我将总结有关此错误的经验,以帮助某人(并阐明一些方案)。
作为@Tom,我使用eclipse和GWT插件(这意味着我倾向于在项目>运行方式> Web应用程序上单击鼠标左键,以运行/测试我的Web应用程序)...
另外,我的项目基于maven,所以我的GWT项目是使用maven GWT插件提供的maven原型创建的:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
...
</plugin>
根据插件文档(google_plugin),该插件生成的项目与GWT Eclipse插件完美集成;那是真实的!
但是,如果您的客户端代码(转换为javascript的Java代码)包含JPA批注(例如域对象),则在各种情况下都会遇到一些错误(这里我假设您使用的是maven,但是结论也可以应用于常规项目):
场景一(编译错误):您将无法编译GWT应用程序,因为编译器将抱怨不知道这些注释中的任何一个。如果您使用的是maven,则可以使用依赖项解决此问题:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
方案二(代码已编译,但是在devmode上运行应用程序时出现\“ thesence属性... \”错误):@rjdkolb指出,问题在于javaee-api依赖项是剥离代码。 ..因此,为了消除错误,您应该使用完整的实现库替换该依赖项。我建议您使用自己的应用程序服务器库,在我的情况下为JBOSS ...所以我说,
<dependency>
<groupId>org.jboss</groupId>
<artifactId>ejb3-persistence</artifactId>
<version>5.1.0.GA</version>
<scope>provided</scope>
</dependency>
(请注意,我是从JBOSS nexus存储库获得该库的,然后将该库安装在本地MAVEN存储库中)...
还要确保该依赖项出现在gwt-user和gwt-servlet依赖项之前(因此该依赖项优先于最后两个)...
这是出现怪异部分的地方...如果您使用gwt插件运行GWT项目(我的意思是,您使用mvn gwt:run命令),您将摆脱\“ missing attribute ... \”问题...
但是,如果使用Eclipse GWT插件(“运行方式”>“ Web应用程序”),您仍然会遇到“缺少属性... \”问题...我不知道为什么,但是Eclipse插件没有\似乎没有完全遵守pom依赖关系;相反,它遵循项目属性(“项目属性”>“ Java构建路径”>“库”)中定义的类路径。
因此,为了消除错误,在使用选项“运行方式> Web应用程序”时,必须将完整的库(在我的情况下为ejb3-persistence)添加到项目类路径(“项目属性”>“ Java Build”)路径>库>添加...),并使该库优先于GWT Eclipse插件库(项目属性> Java构建路径>订购和导出;它必须出现在maven依赖项和GWT容器库之前)...
希望有帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。