Java 将GWT模块项目包括为“必需项目”时类未找到异常

Java 将GWT模块项目包括为“必需项目”时类未找到异常,java,eclipse,gwt,jetty,Java,Eclipse,Gwt,Jetty,我正试图在GWT开发jetty服务器上以开发模式将一个GWT模块和一个小型MVP框架合并到一个GWT项目中。如果我将模块的源代码直接复制到项目中,我就可以这样做。如果我在项目中包含一个包含模块的jar,我也同样成功 然而,我的偏好是将模块作为eclipse中主项目的“必需项目”包括在内,因为模块和项目都在积极开发中。不幸的是,当我尝试在开发模式下启动主项目时,控制台会显示以下错误: WARNING: failed greetServlet: java.lang.NoClassDefFoundEr

我正试图在GWT开发jetty服务器上以开发模式将一个GWT模块和一个小型MVP框架合并到一个GWT项目中。如果我将模块的源代码直接复制到项目中,我就可以这样做。如果我在项目中包含一个包含模块的jar,我也同样成功

然而,我的偏好是将模块作为eclipse中主项目的“必需项目”包括在内,因为模块和项目都在积极开发中。不幸的是,当我尝试在开发模式下启动主项目时,控制台会显示以下错误:

WARNING: failed greetServlet: java.lang.NoClassDefFoundError: com/gmles/framework/client/AuthService
Aug 19, 2011 7:33:22 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed com.google.apphosting.utils.jetty.DevAppEngineWebAppContext@7ac412dd{/,/Users/logan/Documents/workspace/HCASchedule/war}: java.lang.NoClassDefFoundError: com/gmles/framework/client/AuthService
Aug 19, 2011 7:33:22 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: failed JettyContainerService$ApiProxyHandler@4c7335b1: java.lang.NoClassDefFoundError: com/gmles/framework/client/AuthService
Aug 19, 2011 7:33:22 PM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Error starting handlers
java.lang.NoClassDefFoundError: com/gmles/framework/client/AuthService
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 com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
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 com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at org.mortbay.util.Loader.loadClass(Loader.java:91)
at org.mortbay.util.Loader.loadClass(Loader.java:71)
at org.mortbay.jetty.servlet.Holder.doStart(Holder.java:73)
at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:242)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
at org.mortbay.jetty.Server.doStart(Server.java:224)
at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
at com.google.appengine.tools.development.JettyContainerService.startContainer(JettyContainerService.java:185)
at com.google.appengine.tools.development.AbstractContainerService.startup(AbstractContainerService.java:147)
at com.google.appengine.tools.development.DevAppServerImpl.start(DevAppServerImpl.java:219)
at com.google.appengine.tools.development.gwt.AppEngineLauncher.start(AppEngineLauncher.java:86)
at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:500)
at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1055)
at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:804)
at com.google.gwt.dev.DevMode.main(DevMode.java:309)
Caused by: java.lang.ClassNotFoundException: com.gmles.framework.client.AuthService
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at com.google.appengine.tools.development.IsolatedAppClassLoader.loadClass(IsolatedAppClassLoader.java:151)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 48 more

了解发生这种情况的原因吗?

尝试将jar放入WEB-INF/lib文件夹。

注意ClassNotFoundException和NoClassDefFoundError是不同的。将模块项目的输出目录更改为其自己的WEB-INF目录不起作用;同样的错误。我不想将其配置为直接输出到另一个项目的目录中——如果我要这样做,我还可以将模块源代码放到主项目中并从那里进行开发。主项目已经配置为输出到WEB-INF中的“classes”文件夹。我已经尝试过将jar放入其中-它可以工作。我真的很希望能够包括模块的项目,这样我就可以在多个项目中同时使用它。我更新了我的答案,并找出了你说的不起作用的内容。我也想知道你在说什么;但我还没找到办法。我认为maven可能会做你所说的事;并且您可能能够编写一个ANT任务,当您进行构建时运行该任务,以确保其中的lib文件夹是最新的。此外,如果您在linux上,您可能能够创建一个返回到build/lib文件夹的符号链接;但是到目前为止,除了把罐子放到WEB-INF/lib中,我还没有找到更干净的方法:/Ok,谢谢。我会试着和Maven玩一会儿。我有一种感觉,GWT插件可能只是以这样一种方式扰乱了类路径,削弱了Eclipse的“必需项目”机制。