Компиляция проекта 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 есть плагины, которые делают все, что вы пытаетесь, стандартным образом.