繁体   English   中英

Google Web 工具包运行时错误:非本机或抽象方法中缺少代码属性

[英]Google Web Toolkit Runtime error: Absent Code attribute in method that is not native or abstract

我正在 GWT 中迈出第一步,我对这些可能性着迷。

到目前为止,我已经建立了一个小项目,它依赖于外部库中提供的 java 类。 这个库通过 maven(自己的存储库)提供给我的项目。 我想在客户端使用该库中的 Java 类 - 所以我必须在 jar 中提供源代码,并且必须确保这些类不使用无法转换为 Z9E13B69D1D754DA927Z102AAF 的代码

到目前为止,一切都很好。 我终于克服了找不到源代码的错误。现在在 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 应用由内部应用服务器托管。 JDK 在 Mac OS X 上是 1.6。对此有什么想法吗?

JDK 不包含javax.persistence package 的实现——它是 Java EE 的一部分。 即使是这样,您也不应该在客户端包含 SQL 相关库 - 您的 GWT 应用程序无法直接查询 SQL 服务器。

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>

不会影响您的部署,因为它已提供。

我将总结我对此错误的经验,以帮助某人(并澄清一些场景)。

As @Tom, I use eclipse and the GWT Plugin (and this means that I tend to do left click on my project > Run As > Web Application, in order to run/test my web application)...

Also, my projects are based on maven, so my GWT project was created using the maven archetype provided by the maven GWT plugin:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>gwt-maven-plugin</artifactId>
...
</plugin>

根据插件文档( google_plugin ),该插件生成的项目与 GWT Eclipse 插件完美集成; 那是真实的!

但是,如果您的客户端代码(转换为 javascript 的 java 代码)包含 JPA 注释(例如域对象),您将在各种情况下遇到一些错误(这里我假设您使用 Z402C5D9AF6B407F714D0 作为结论,但是 5EEB407F714D0也可以应用于常规项目):

场景一(编译错误):您将无法编译您的 GWT 应用程序,因为编译器会抱怨不知道这些注释中的任何一个。 如果您使用的是 maven,则可以使用依赖项解决此问题:

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

场景二(代码编译,但在 devmode 上运行应用程序时出现“缺席属性......”错误):正如@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 命令),你将摆脱“the缺席”属性...... ..

However, if you use the Eclipse GWT plugin (Run As > Web Application), you will get still the "the absence attribute..." Problem... I don't know why, but the Eclipse Plugin doesn't seem to完全服从 pom 依赖; 相反,它遵循项目属性中定义的类路径(项目属性> Java 构建路径> 库)

因此,为了消除错误,当使用“运行方式 > Web 应用程序”选项时,必须将完整的库(在我的情况下为 ejb3-persistence)添加到项目类路径(项目属性 > Java 构建路径 > Libraries > Add...) and make the library to take precedence over the GWT Eclipse Plugin Libraries (Project Properties > Java Build Path > Order and Export; it must appear before the maven dependencies and the GWT Container Library)...

希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM