无法在Google App Engine Java项目中使用外部库

13
我有一个安装了Google App Engine插件和Google App Engine SDK 1.3.0的Eclipse。 我使用Google App Engine SDK 1.3.0创建了一个新的Web项目。 现在,我想为jsp文件添加一个名为EL-functors的高级JSTL语法库(http://el-functors.sourceforge.net)。 为了让EL-functors在jsp文件中捕获其高级语法并将它们编译成标准的jsp语法,我必须在web.xml中添加一些监听器:
<listener>
  <listener-class>beanface.el.functor.InstallFunctorListener</listener-class>
</listener>

此外,我已将standar.jar、jstl.jar和el-functors-1.0.3.jar添加到我的构建路径中。 但是,当我启动Web服务器(使用Debug As> Web Project)时,在控制台日志中,我看到以下错误消息:

Initializing AppEngine server
Feb 5, 2010 7:22:45 AM com.google.apphosting.utils.jetty.JettyLogger warn
WARNING: Could not instantiate listener beanface.el.functor.InstallFunctorListener
java.lang.ClassNotFoundException: beanface.el.functor.InstallFunctorListener
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at ........
    at com.google.gwt.dev.DevMode.doStartUpServer(DevMode.java:421)
    at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1035)
    at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:783)
    at com.google.gwt.dev.DevMode.main(DevMode.java:275)

我猜测有一些原因导致库未被加载。当我来到war/WEB-INF/lib时,我看不到standard.jar、jstl.jar和el-functors.1.0.3.jar,只有谷歌应用引擎库被部署。

问题出在哪里?我该如何解决?

3个回答

24
您需要手动将所需的jar文件复制到/WEB-INF/lib文件夹中。
我在开始使用app-engine构建时遇到了类似的问题。经过一些研究,我得出结论,这是使其正常工作的唯一方法。如果我错了,很乐意知道 :)

1
是的,这个方法可以工作。但真的,这是实现它的唯一 方法吗?没有Eclipse样式的构建路径管理吗?war / WEB-INF / lib太过于原始了! - Hendy Irawan
这对我也起作用,但我想知道为什么即使我们已经在类路径中有了类文件,我们还必须将jar放在WEB-INF / lib下?也许gwt dev模式只尊重WEB-INF中的类/ jar? - Mike
我认为必须手动放置在 war/WEB-INF/lib 中的原因是整个 Eclipse 项目都在您的本地计算机上。当您引用一个 jar 文件时,实际上是在指向计算机中某个位置。然而,Google 使用自己的服务器托管应用程序,因此这些 jar 文件需要在他们的服务器上有一份副本。 - Matthew Quiros
我可以理解这可能是部署时必要的,但是在开发模式下也需要吗?真的吗?所以,如果我在一个独立的Java项目中开发我的应用程序的某些部分,我需要不断地进行导出才能测试吗?哎呀……简直是太糟糕了! - Markus A.
如果在本地可以运行但在生产环境中无法运行,那将会更加丑陋。至少在开发模式下看到错误会让你免于认为它能够正常工作而实际上不能。确定性++。 - Ajax

5

手动复制JAR包有一个用户友好的替代方法 - 快速修复

转到标记视图,找到适当的警告(以下类路径条目“...),从上下文菜单中选择“快速修复”,然后单击“将..复制到/ WEB-INF / lib并更新类路径以引用此JAR包”


1

我正在使用App Wrench工具自动将jar文件复制到/WEB-INF/lib目录中。只有在该jar文件中没有任何被标记为@Entity的类时才有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接