Java 控制JAR在类路径中的加载顺序

Java 控制JAR在类路径中的加载顺序,java,gwt,classpath,Java,Gwt,Classpath,我将GWT2.4与gquery dnd bundle 1.0.4一起使用,这样我就可以使用拖放节点构建树。我碰到了一只讨厌的虫子(http://code.google.com/p/gwtquery-plugins/issues/detail?id=6). 其要点是,我需要保证类加载器在运行时先加载文件“gquery-dnd-bundle-1.0.4.jar”,然后再加载WEB-INF/lib目录中的gwt-servlet.jar文件 我怎么能保证这一点 如果有用的话,我正在将EclipseIn

我将GWT2.4与gquery dnd bundle 1.0.4一起使用,这样我就可以使用拖放节点构建树。我碰到了一只讨厌的虫子(http://code.google.com/p/gwtquery-plugins/issues/detail?id=6). 其要点是,我需要保证类加载器在运行时先加载文件“gquery-dnd-bundle-1.0.4.jar”,然后再加载WEB-INF/lib目录中的gwt-servlet.jar文件

我怎么能保证这一点

如果有用的话,我正在将EclipseIndigo与GWTWeb应用程序项目一起使用

这就是我看到的确切错误

[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
[ERROR][draganddroptree]-“jar:file:/C:/Documents%20和%20设置/E18538/workspace/draganddroptree/war/WEB-INF/lib/gquery-dnd-bundle-1.0.4.jar”中的错误/gwtquery/plugins/droppable/client/gwt/DragAndDropCellTree.java'
[错误][draganddroptree]-第24行:com.google.gwt.user.cellview.client.CellTreeNodeView类型不可见
[错误][draganddroptree]-第86行:CellTreeNodeView无法解析为类型
[错误][draganddroptree]-第87行:构造函数DragAndDropCellTreeNodeView(DragAndDropCellTree,CellTreeNodeView,TreeViewModel.NodeInfo,Element,T)引用缺少的类型CellTreeNodeView
[错误][draganddroptree]-无法加载模块入口点类com.cme.draganddroptree.client.draganddroptree(有关详细信息,请参阅相关异常)
[错误][draganddroptree]-未能在本地主机4490上从用户代理“Mozilla/5.0(Windows NT 5.1)AppleWebKit/535.1(KHTML,如Gecko)Chrome/14.0.835.202 Safari/535.1”加载模块“draganddroptree”

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

例如:

  • 将“gwtservlet.jar”文件放在“$CATALINA_BASE/lib”目录中
  • 将“gquery-dnd-bundle-1.0.4.jar”文件保存在WAR中 这样,“GWTServlet.jar”将首先加载到类路径中,然后加载“gquery-dnd-bundle-1.0.4.jar”。。。覆盖“GWTServlet.jar”中任何冲突的类

    如果您正在使用其他应用程序服务器,那么服务器级别的“lib”目录将不同。。。但基本思想是,低优先级的JAR需要进入应用服务器的“库”,而高优先级的JAR需要留在webapp的“库”

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

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

    要解决这个问题,您应该在类路径中将gquery-dnd-bundle-1.0.4.jar设置在GWT之前。在项目属性中使用Eclipse转到Java构建路径/命令导出,并确保gquery库在GWT之前

    无论如何,您可能会遇到另一个问题,因为gquery-dnd-bundle-1.0.4.jar与GWT2.3.x兼容,并且您正在使用GWT2.4。在新版本的dnd捆绑包发布之前,您可以使用(包含dnd捆绑包)和


    您还应该了解GWT2.4中添加的本机拖放支持。文档很少,但我发现了这一点(您可以从右侧拖动模板并将其放到任务详细信息中),以及相关的。(来自此的信息)

    我使用的是一个非常旧的tomcat版本,但IIRC它会按名称的字母顺序扫描罐子。也许现在情况已经改变了。可能就是这样,尽管你不能保证它会一直工作。它没有说[这里[()确实如此,但我怀疑您的WEB应用程序的/WEB-INF/lib/*.jar所指的不是字母顺序。这可能取决于Java进程查询目录时返回文件的顺序。除非您明确告诉“文件”类,则此顺序由基础操作系统决定。在Linux和新一代Windows上,它可能总是按字母升序排列。在旧版本的Windows上,它可能更随机。无论如何,它可能是按字母排列的,但您不能“保证”这一点。此外,由于“gquery-dnd-bundle-1.0.4.jar”按字母顺序排在“gwt servlet.jar”之前,如果这是一个简单的按字母顺序排列的第一次获胜的问题,他可能不会首先看到这个问题。