Компиляция проекта GWT eclipse из командной строки, без eclipse: ошибка компиляции

Мы получили проект GWT в Eclipse, который в противном случае работает. Теперь я хочу иметь скрипт, который запускается на сервере, который извлекает последнюю версию из системы контроля версий, компилирует ее на сервере и развертывает ее. Это сэкономит нам много ручной работы и позволит развернуть новую версию при подключении с ограниченной пропускной способностью (поскольку нам не нужно загружать приложение на сервер).

После извлечения последней версии исходного кода скрипт пытается скомпилировать код с помощью следующей команды:

java -cp "/path/eclipse/plugins/com.google.gwt.eclipse.sdkbundle_2.5.0.v201211121240-rel-r42/gwt-2.5.0/*:/path/company/projects/pull-compile-deploy/X/X/src:/path/company/projects/pull-compile-deploy/X/X/war/WEB-INF/lib/*" com.google.gwt.dev.Compiler nl.company.projects.X

Compiling module nl.company.projects.X
   Finding entry point classes
      [ERROR] Unable to find type 'nl.company.projects.X.client.XMain'
         [ERROR] Hint: Previous compiler errors may have made this type unavailable
         [ERROR] Hint: Check the inheritance chain from your module; it may not be inheriting a required module or a module may not be adding its source path entries properly

Весь исходный код находится в /path/company/projects/pull-compile-deploy/X/X/src и все используемые.jars (кроме GWT) находятся в /path/company/projects/pull-compile-deploy/X/X/war/WEB-INF/lib/, Очевидно, что-то идет не так.

Вопросы: файл /path/company/projects/pull-compile-deploy/X/X/src/nl/company/projects/X/client/XMain.java существует и должен быть imho в classpath?! Кто-нибудь Есть идеи, что может пойти не так? Возможно ли увидеть в каком-то журнале именно те команды, которые eclipse выполняет для компиляции? Я посмотрел на build.xml, который eclipse может экспортировать, но кажется, что он не содержит цели для компиляции для производства.

что-то еще: по-видимому, GWT ожидает X.gwt.xml бить /path/company/projects/pull-compile-deploy/X/X/src/nl/company/project/X.gwt.xmlв то время как затмение положить его в /path/company/projects/pull-compile-deploy/X/X/src/nl/company/project/X/X.gwt.xml (т.е. вложенный в один каталог глубже), я исправил это, создав символическую ссылку.

Дальнейшее редактирование: поскольку один из ответов был посвящен тому, как я использовал инструменты компиляции, я переписал его в Ant, см. Ниже. Проблема остается, конечно.

<!-- Compile the source using javac. -->
<target name="compile" depends="init">
    <javac srcdir="src/" destdir="bin/">
        <classpath refid="project.classpath"/>
    </javac>
</target>


<!-- Use the GWT-compiler. -->
<target name="gwt-compile" depends="compile">
    <java failonerror="true" fork="true" classname="com.google.gwt.dev.Compiler">
        <classpath>
            <path refid="project.classpath"/>
            <pathelement location="src/"/>
            <pathelement location="bin/"/>
        </classpath>
        <jvmarg value="-Xmx512M"/>
        <arg value="${module.name}"/>
    </java>
</target>

Что-то не так с вышеуказанным Ant-скриптом?module.name = nl.company.projects.X и путь с refid="project.classpath" содержит все используемые библиотеки, а также библиотеки GWT (gwt-user.jar, gwt-dev.jar и validation-api-1.0.0.GA(-source).jar).

Класс XMain ничего не наследует (кроме Object) и реализует только EntryPoint (который включен в gwt-user.jar). Поэтому я не думаю, что проблема связана со вторым указанием, которое дает компилятор.

Есть идеи?

2 ответа

Решение

GWT требует от вас javac ваши занятия, это нужно как *.java и *.class файлы.

Это не всегда имело место и должно измениться в будущем (см., Например, https://code.google.com/p/google-web-toolkit/issues/detail?id=7602), но сейчас это состояние дела: нужно javac прежде чем ты сможешь com.google.gwt.dev.Compiler,

javac -cp "/path/eclipse/plugins/com.google.gwt.eclipse.sdkbundle_2.5.0.v201211121240-rel-r42/gwt-2.5.0/*:/path/company/projects/pull-compile-deploy/X/X/war/WEB-INF/lib/*" -sourcepath /path/company/projects/pull-compile-deploy/X/X/src /path/company/projects/pull-compile-deploy/X/X/src/nl/company/projects/X.java -d /path/company/projects/pull-compile-deploy/X/X/bin

java -cp "/path/eclipse/plugins/com.google.gwt.eclipse.sdkbundle_2.5.0.v201211121240-rel-r42/gwt-2.5.0/*:/path/company/projects/pull-compile-deploy/X/X/src:/path/company/projects/pull-compile-deploy/X/X/bin:/path/company/projects/pull-compile-deploy/X/X/war/WEB-INF/lib/*" com.google.gwt.dev.Compiler nl.company.projects.X

(пожалуйста, дважды проверьте вышеупомянутые команды перед использованием)

РЕДАКТИРОВАТЬ: (в ответ на ваш "вопрос" о X.gwt.xml): GWT ожидает X.gwt.xml в nl/company/projects/X.gwt.xml потому что это то, что вы сказали, чтобы использовать: module.name = nl.company.projects.x, Если файл в nl/company/projects/X/X.gt.xml затем используйте nl.company.projects.X.X как имя модуля. Использование символической ссылки здесь может быть проблемой: исходный путь для модуля (поиск <source по адресу https://developers.google.com/web-toolkit/doc/latest/DevGuideOrganizingProjects) будет nl/company/projects/client и, следовательно, не будет включать nl/company/projects/X/client где твой XMain классная жизнь; это недоступно для компилятора GWT.


Тем не менее, я полностью согласен с SSR: используйте достойный инструмент для сборки: Ant, Maven, Gradle, Make, что угодно, это сделает вашу жизнь намного проще. Инструмент сборки, который управляет зависимостями (Ant+Ivy, Maven, Gradle), является еще лучшим IMO.

Зачем в АД вы бы проходили такое нестандартное упражнение, как это.

Если это неакадемический проект, тогда ИСПОЛЬЗУЙТЕ maven. Если вам трудно найти мавена, используйте муравья.

Примеры для обоих типов предоставлены командой GWT - http://code.google.com/p/google-web-toolkit/source/browse/.

Примечание. У maven есть плагины, которые делают все, что вы пытаетесь, стандартным образом.

Другие вопросы по тегам