Компиляция GWT не может загрузить класс

Я пытаюсь скомпилировать GWT из своего проекта из командной строки (без Ant/Maven), как это

java -cp "/home/user/gwt-2.8.2/*:/home/user/myapp/src:/home/user/myapp/lib/*" com.google.gwt.dev.Compiler com.myapp.webservices.SpwrWebServices

но вылетает ошибка

Loading inherited module 'com.myapp.webservices.SpwrWebServices'
   Loading inherited module 'gwt.material.design.GwtMaterialWithJQuery'
      Loading inherited module 'gwt.material.design.GwtMaterialDesignBase'
         [WARN] Line 40: Setting configuration property named 'CssResource.legacy' in module 'gwt.material.design.GwtMaterialDesignBase' that has not been previously defined
   [ERROR] Line 18: Unable to load class 'com.myapp.webservices.client.util.GitCommitGenerator'
java.lang.ClassNotFoundException: com.myapp.webservices.client.util.GitCommitGenerator
    at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.google.gwt.dev.cfg.ModuleDefSchema$ClassAttrCvt.convertToArg(ModuleDefSchema.java:899)
    at com.google.gwt.dev.util.xml.HandlerArgs.convertToArg(HandlerArgs.java:64)
    at com.google.gwt.dev.util.xml.HandlerMethod.invokeBegin(HandlerMethod.java:221)
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.startElement(ReflectiveParser.java:296)
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
    at org.apache.xerces.impl.dtd.XMLDTDValidator.startElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.parse(ReflectiveParser.java:349)
    at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.access$200(ReflectiveParser.java:70)
    at com.google.gwt.dev.util.xml.ReflectiveParser.parse(ReflectiveParser.java:431)
    at com.google.gwt.dev.cfg.ModuleDefLoader.nestedLoad(ModuleDefLoader.java:316)
    at com.google.gwt.dev.cfg.ModuleDefLoader.load(ModuleDefLoader.java:243)
    at com.google.gwt.dev.cfg.ModuleDefLoader.doLoadModule(ModuleDefLoader.java:193)
    at com.google.gwt.dev.cfg.ModuleDefLoader.loadFromResources(ModuleDefLoader.java:151)
    at com.google.gwt.dev.cfg.ModuleDefLoader.loadFromClassPath(ModuleDefLoader.java:126)
    at com.google.gwt.dev.Compiler.compile(Compiler.java:139)
    at com.google.gwt.dev.Compiler$1.run(Compiler.java:118)
    at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:55)
    at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:50)
    at com.google.gwt.dev.Compiler.main(Compiler.java:125)

У меня есть файл src/com/myapp/webservices/client/util/GitCommitGenerator.java, поэтому я не понимаю, что у меня отображается эта ошибка. Мой xml-файл конфигурации gwt выглядит так

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.7.0//EN" "\s">
<module rename-to= "SpwrWebServices">
    <inherits name="com.google.gwt.user.User" />

   <!--  GwtMaterialWithJQuery module is smaller and should be  used for production code -->
   <!--   <inherits name="gwt.material.design.GwtMaterialWithJQuery" /> -->

   <!-- GWTMaterialWithJQueryDebug   This module  is larger and includes non-minified source for easier debugging --> 
   <!-- GWT Material -->
    <inherits name="gwt.material.design.GwtMaterialWithJQuery"/>
    <inherits name="gwt.material.design.addins.GwtMaterialAddins"/>
    <inherits name="org.fusesource.restygwt.RestyGWT" />
    <inherits name='com.googlecode.gwt.charts.Charts'/>
    <inherits name="org.moxieapps.gwt.uploader.Uploader"/>
    <set-property name="gwt.logging.enabled" value="TRUE"/>
    <set-property name="gwt.logging.logLevel" value="INFO"/>
    <generate-with class="com.myapp.webservices.client.util.GitCommitGenerator">
        <when-type-assignable class="com.myapp.webservices.client.util.GitCommit"/>
     </generate-with>
  <source path="client" />
  <!--  <source path ="shared" />  -->
    <entry-point
        class="com.myapp.webservices.client.SpwrWsEntryPoint" />
    <set-property name="user.agent" value="gecko1_8,safari"/>
    <set-configuration-property name='xsiframe.failIfScriptTag' value='FALSE'/>
</module>

Что не так с приведенной выше конфигурацией и как я могу получить чистую компиляцию?


person Most Wanted    schedule 14.03.2019    source источник


Ответы (2)


Во-первых, генераторы больше не должны быть написаны по-новому, вы должны начать с процессоров аннотаций Java или какой-либо другой функции, которая не зависит от кода, генерирующего код компилятора GWT.

Во-вторых, любой Генератор, который вы пишете, не должен быть помещен в ваш client пакет, а должен находиться где-то, где GWT не будет пытаться скомпилировать его в исходники JS. Обычно люди используют соглашение rebind для классов, которое позволяет вам изменять привязки вашего кода GWT и генерировать новые классы.

Наконец, похоже, что вы запускаете компилятор GWT в своих источниках без предварительной компиляции их с помощью java. Сначала используйте javac для компиляции всех ваших файлов .java в файлы .class, а затем передайте их в остальную часть пути к классам. Технически вам нужен только ваш генератор и все, на что он ссылается, но вы, вероятно, хотели бы, чтобы Javac сообщал об ошибках до того, как это сделает GWT, так как он будет выполнять свою работу лучше.

Вместо этого рассмотрите Maven или Gradle для управления вашей сборкой, чтобы javac работал за вас, а также строил путь к классам, чтобы предоставить GWT для вас.

person Colin Alworth    schedule 14.03.2019
comment
Буду признателен, если вы посмотрите на мою проблему компиляции GWT stackoverflow.com/q/67316333/398348 - person likejudo; 29.04.2021

Проект определяет генератор внутри дескриптора модуля:

    <generate-with class="com.myapp.webservices.client.util.GitCommitGenerator">
        <when-type-assignable class="com.myapp.webservices.client.util.GitCommit"/>
     </generate-with>

Генератор находится в пакете client. GWT попытается его скомпилировать, что наверняка потерпит неудачу.

Попробуй это:

  • создайте новый пакет помимо клиентского пакета, вызовите ist rebind
  • переместите GitCommitGenerator в этот пакет.
  • обновите ссылку внутри дескриптора вашего модуля на
     <generate-with class="com.myapp.webservices.rebind.GitCommitGenerator">
        <when-type-assignable class="com.myapp.webservices.client.util.GitCommit"/>
     </generate-with>

Думаю, это решит проблему.

person El Hoss    schedule 14.03.2019