2010-03-15 56 views
3

我想在我的GWT网络应用程序的视图类中使用org.apache.commons.validator.GenericValidator类。我读过,我必须隐含地告诉我打算使用这个外部库。我认为将下一行添加到我的App.gwt.xml将起作用。如何在GWT模块中包含外部jar?

<inherits name='org.apache.commons.validator.GenericValidator'/>

我得到了一个错误:

Loading inherited module 'org.apache.commons.validator.GenericValidator' 
     [ERROR] Unable to find 'org/apache/commons/validator/GenericValidator.gwt.xml' on your classpath; could be a typo, or maybe you forgot to include a classpath entry for source? 
    [ERROR] Line 13: Unexpected exception while processing element 'inherits' 
    com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries) 
at com.google.gwt.dev.cfg.ModuleDefLoader.nestedLoad(ModuleDefLoader.java:239) 
    at com.google.gwt.dev.cfg.ModuleDefSchema$BodySchema.__inherits_begin(ModuleDefSchema.java:354) 
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.google.gwt.dev.util.xml.HandlerMethod.invokeBegin(HandlerMethod.java:223) 
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.startElement(ReflectiveParser.java:270) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:179) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1339) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2747) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.parse(ReflectiveParser.java:327) 
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.access$100(ReflectiveParser.java:48) 
    at com.google.gwt.dev.util.xml.ReflectiveParser.parse(ReflectiveParser.java:398) 
    at com.google.gwt.dev.cfg.ModuleDefLoader.nestedLoad(ModuleDefLoader.java:257) 
    at com.google.gwt.dev.cfg.ModuleDefLoader$1.load(ModuleDefLoader.java:169) 
    at com.google.gwt.dev.cfg.ModuleDefLoader.doLoadModule(ModuleDefLoader.java:283) 
    at com.google.gwt.dev.cfg.ModuleDefLoader.loadFromClassPath(ModuleDefLoader.java:141) 
    at com.google.gwt.dev.Compiler.run(Compiler.java:184) 
    at com.google.gwt.dev.Compiler$1.run(Compiler.java:152) 
    at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:87) 
    at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:81) 
    at com.google.gwt.dev.Compiler.main(Compiler.java:159) 
[ERROR] Failure while parsing XML 
com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries) 
    at com.google.gwt.dev.util.xml.DefaultSchema.onHandlerException(DefaultSchema.java:56) 
    at com.google.gwt.dev.util.xml.Schema.onHandlerException(Schema.java:66) 
    at com.google.gwt.dev.util.xml.Schema.onHandlerException(Schema.java:66) 
    at com.google.gwt.dev.util.xml.HandlerMethod.invokeBegin(HandlerMethod.java:233) 
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.startElement(ReflectiveParser.java:270) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:179) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1339) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2747) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) 
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.parse(ReflectiveParser.java:327) 
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.access$100(ReflectiveParser.java:48) 
    at com.google.gwt.dev.util.xml.ReflectiveParser.parse(ReflectiveParser.java:398) 
    at com.google.gwt.dev.cfg.ModuleDefLoader.nestedLoad(ModuleDefLoader.java:257) 
    at com.google.gwt.dev.cfg.ModuleDefLoader$1.load(ModuleDefLoader.java:169) 
    at com.google.gwt.dev.cfg.ModuleDefLoader.doLoadModule(ModuleDefLoader.java:283) 
    at com.google.gwt.dev.cfg.ModuleDefLoader.loadFromClassPath(ModuleDefLoader.java:141) 
    at com.google.gwt.dev.Compiler.run(Compiler.java:184) 
    at com.google.gwt.dev.Compiler$1.run(Compiler.java:152) 
    at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:87) 
    at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:81) 
    at com.google.gwt.dev.Compiler.main(Compiler.java:159) 
[ERROR] Unexpected error while processing XML 
com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries) 
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.parse(ReflectiveParser.java:351) 
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.access$100(ReflectiveParser.java:48) 
    at com.google.gwt.dev.util.xml.ReflectiveParser.parse(ReflectiveParser.java:398) 
    at com.google.gwt.dev.cfg.ModuleDefLoader.nestedLoad(ModuleDefLoader.java:257) 
    at com.google.gwt.dev.cfg.ModuleDefLoader$1.load(ModuleDefLoader.java:169) 
    at com.google.gwt.dev.cfg.ModuleDefLoader.doLoadModule(ModuleDefLoader.java:283) 
    at com.google.gwt.dev.cfg.ModuleDefLoader.loadFromClassPath(ModuleDefLoader.java:141) 
    at com.google.gwt.dev.Compiler.run(Compiler.java:184) 
    at com.google.gwt.dev.Compiler$1.run(Compiler.java:152) 
    at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:87) 
    at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:81) 
    at com.google.gwt.dev.Compiler.main(Compiler.java:159) 

commons.validator-1.3.1.jarwar/WEB-INF/lib

我使用日食与谷歌插件。

任何人都知道它是如何工作的?

回答

8

语法<inherits name='package.SomeModule'/>仅适用于特殊的GWT模块,它构建为与GWT一起使用,而不是泛型Java库(docs)。查看是否构建了一个用于GWT的jar /库的快速测试是查看它是否包含模块文件。如果你看一下你的错误顶贴一行:

Loading inherited module 'org.apache.commons.validator.GenericValidator' 
     [ERROR] Unable to find 'org/apache/commons/validator/GenericValidator.gwt.xml' on your classpath; could be a typo, or maybe you forgot to include a classpath entry for source? 

你可以看到,commons.validator缺少必要的模块文件。你仍然可以在服务器端使用这个库(没有限制)。对于客户端来说,GWT并不会效仿Java所需的部分 - 更多信息see the docs

+1

我希望有一个解决这个问题的方法。如果我知道/某个类可以通过GWT编译成JavaScript,如果它不在GWT模块中,我仍然不能包含它。 – 2011-12-27 16:21:38

0

如果这是你的库,你需要做的是为你希望GWT能够编译的每个包添加一个XXX.gwt.xml文件。例如,您可以将共享jar添加到多层(和多服务器)应用程序的GWT前端。您可以使用任意一个GWT库并解压他们的jar以查看我的意思,将会有一个名为XXX.gwt.xml的文件,位于GWT需要能够用来编译的所有软件包的上一级。

在过去,我已经采取并重新打包了一些这些开源库,您可以在这里做。这是有问题的,因为那时你确实需要控制你的库的版本,并且必须手动合并任何新的更改(或者只是重做XXX.gwt.xml文件条目和重新打包)。

因此,这不是最好的情况(但有时你现在正在寻找错过,而不是错过正确的),有没有办法解决这个问题,只是使用核心GWT和Java?我知道预制图书馆很棒,但是对于额外工作的依赖性值得您在特定情况下节省时间吗?

我希望有帮助。

3

或者,您可以将GWT模块XML文件添加到您的项目中。过去我不得不这样做。

这不是“理想的”,但它可以帮助您不必重新包装罐子。

在这种情况下,您可以创建一个名为“Commons.gwt.xml”的文件,并将其放入本地源路径的/org/apache/commons目录中。该文件将包含:

<module> 
    <source path="validator"/> 
</module> 

然后,你只需要行<inherits name="org.apache.commons.Common">添加到您的应用程序。

相关问题