【问题标题】:Controlling the order of how JARs are loaded in the classpath控制 JAR 在类路径中的加载顺序
【发布时间】:2011-10-07 05:09:31
【问题描述】:

我将 GWT 2.4 与 gquery-dnd-bundle 1.0.4 一起使用,以便可以使用拖放节点构建树。我遇到了一个烦人的错误(http://code.google.com/p/gwtquery-plugins/issues/detail?id=6)。它的要点是我需要保证在我的 WEB-INF/lib 目录中的 gwt-servlet.jar 文件之前,类加载器在运行时加载文件“gquery-dnd-bundle-1.0.4.jar”。

我如何保证这一点?

如果有用的话,我正在将 Eclipse Indigo 与 GWT Web 应用程序项目一起使用。

这是我看到的确切错误

[ERROR] [draganddroptree] - Errors in 'jar:file:/C:/Documents%20and%20Settings/E18538/workspace/DragAndDropTree/war/WEB-INF/lib/gquery-dnd-bundle-1.0.4.jar!/gwtquery/plugins/droppable/client/gwt/DragAndDropCellTree.java'
        [ERROR] [draganddroptree] - Line 24: The type com.google.gwt.user.cellview.client.CellTreeNodeView is not visible
        [ERROR] [draganddroptree] - Line 86: CellTreeNodeView cannot be resolved to a type
        [ERROR] [draganddroptree] - Line 87: The constructor DragAndDropCellTreeNodeView<T>(DragAndDropCellTree, CellTreeNodeView<?>, TreeViewModel.NodeInfo<T>, Element, T) refers to the missing type CellTreeNodeView
    [ERROR] [draganddroptree] - Unable to load module entry point class com.cme.draganddroptree.client.DragAndDropTree (see associated exception for details)
    [ERROR] [draganddroptree] - Failed to load module 'draganddroptree' from user agent 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1' at localhost:4490

【问题讨论】:

    标签: java gwt classpath


    【解决方案1】:

    您不能以任何确定的顺序安排“WEB-INF/lib”JAR 的加载。我能想到的唯一可靠的解决方法是将较低优先级的 JAR 文件放在“WEB-INF/lib”之前扫描的目录中。

    例如if you are using Tomcat, then you could:

    1. 将“gwt-servlet.jar”文件放在“$CATALINA_BASE/lib”目录中。
    2. 将“gquery-dnd-bundle-1.0.4.jar”文件保留在您的 WAR 中。

    这样,“gwt-servlet.jar”将首先加载到 CLASSPATH 中,然后“gquery-dnd-bundle-1.0.4.jar”将被加载...覆盖来自“gwt- servlet.jar”。

    如果你使用的是其他应用服务器,那么服务器级的“lib”目录会有所不同……但基本思想是低优先级的 JAR 需要进入应用服务器的“lib”,而更高优先级的 JAR 需要保留在 webapp 的“lib”中。

    不是世界上最干净的情况,但它会保证你想要的结果。

    更新:你知道,在仔细考虑并重新阅读 Tomcat 文档之后,我实际上可能把它倒过来了。您可能需要将“gquery-dnd-bundle-1.0.4.jar”放入您的应用服务器“lib”中,并将“gwt-servlet.jar”放入您的 webapp 的“lib”中。如果您尝试我的建议并发现其中一种方法比另一种更适合您,请告诉我,我将编辑我的答案以更准确。

    【讨论】:

    • 我使用的是非常旧版本的 tomcat,但 IIRC 它按名称的字母顺序扫描罐子。也许现在已经改变了。
    • 可能就是这样,虽然你不能保证它会一直有效。
    • 它没有说 [here[(tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html) 确切地说,但我怀疑 /WEB-INF/lib/*.jar of your web application 是否意味着什么但按字母顺序。
    • 这可能取决于Java进程查询目录时返回文件的顺序。除非您明确告诉“文件”类,否则此顺序由底层操作系统确定。在 Linux 和更新一代的 Windows 上,它可能总是按字母升序排列。在旧版本的 Windows 上,它可能更加随机。无论如何,它可能是按字母顺序排列的,但你不能“保证”这一点。
    • 此外,由于“gquery-dnd-bundle-1.0.4.jar”按字母顺序排在“gwt-servlet.jar”之前,他可能一开始就不会看到这个问题是一个简单的按字母顺序获胜的问题。
    【解决方案2】:

    要解决这个bug,您应该在类路径中的 GWT 之前设置 gquery-dnd-bundle-1.0.4.jar。在项目属性中使用 Eclipse 转到 Java Build Path / Order an export 并确保 gquery lib 在 GWT 之前。

    无论如何,您可能还有另一个问题,因为 gquery-dnd-bundle-1.0.4.jar 与 GWT 2.3.x 兼容并且您使用的是 GWT 2.4。在新版本的 dnd-bundle 之前,您可以使用 enhance-plugin-1.0.2.jar(包含 DND 包)和 gwtquery-1.1.0-SNAPSHOT.jar

    您还应该查看 GWT 2.4 中添加的本机拖放支持。文档很少,但我找到了这个example(您可以从右侧拖动模板并将它们放在任务详细信息中),以及相关的source code。 (来自post的信息)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-10
      相关资源
      最近更新 更多