Запуск GWT локально с 2+ модулями
Плагин lipse для запуска и запуска нового веб-приложения "локально" (изнутри Eclipse, используя встроенный контейнер Jetty). Я следую инструкциям в этом уроке GWT и сталкиваюсь с некоторыми проблемами, предположительно из-за того, как у меня определены мои модули.
У меня есть проект веб-приложения со следующей структурой каталогов:
MyWebApp/
src/
com.mywebapp.client.modules
WebModule
AppModule
WebModule.gwt.xml
AppModule.gwt.xml
war/
WEB-INF/
lib/
web.xml
css/
web-module.css
app-module.css
hmtl/
web-module-host-page.html
app-module-host-page.html
Я хочу, чтобы в моем приложении было 2 модуля: WebModule
который является "общедоступным веб-сайтом" и модулем, который загружается, когда пользователь переходит на http://mywebapp.com
и есть AppModule
, который загружается только после входа пользователя в систему и содержит функции "частного приложения" сайта.
WebModule.java
:
public class WebModule implements EntryPoint {
Label label = new Label("Hello, GWT!");
@Override
public void onModuleLoad() {
RootPanel.get().add(label);
}
}
WebModule.gwt.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<module rename-to="web-module">
<inherits name="com.google.gwt.user.User"/>
<inherits name="com.google.gwt.user.theme.standard.Standard"/>
<entry-point class="com.mywebapp.client.modules.WebModule"/>
<source path='client'/>
<source path='shared'/>
</module>
web.xml
:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.5"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<welcome-file-list>
<welcome-file>web-module-host-page.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>SystemServiceServlet</servlet-name>
<servlet-class>com.google.api.server.spi.SystemServiceServlet</servlet-class>
<init-param>
<param-name>services</param-name>
<param-value/>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SystemServiceServlet</servlet-name>
<url-pattern>/_ah/spi/*</url-pattern>
</servlet-mapping>
</web-app>
web-module-host-page.html
:
<!doctype html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<link type="text/css" rel="stylesheet" href="css/web-module.css">
<title>Hello, GWT!</title>
<script type="text/javascript" language="javascript" src="mywebapp/mywebapp.nocache.js"></script>
</head>
<body>
<iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
<noscript>
Turn on javascript!
</noscript>
</body>
</html>
Чтобы попытаться запустить это из Eclipse (в режиме разработки, чтобы я мог запустить / отладить из браузера, указывая на localhost
url), я создал новую конфигурацию запуска следующим образом:
Run Configurations
Main tab
Main class: com.google.gwt.dev.DevMode
Server tab
"Run built-in server" is checked at Port 8888
GWT tab
Code server port: 9997
Available modules:
AppModule - com.mywebapp.client.modules.AppModule
WebModule - com.mywebapp.client.modules.WebModule
Arguments tab - see below
Вкладка "Аргументы" >> Аргументы программы:
-remoteUI "$ {gwt_remote_ui_server_port}: $ {unique_id}" -startupUrl web-модуль-host-page.html -logLevel INFO -codeServerPort 9997 -port 8888 -сервер com.google.appengine.tools.development.gwt.AppEngineunc / home / myuser / песочница / верстак / eclipse /workspace/mywebapp/war com.mywebapp.client.modules.WebModule com.mywebapp.client.modules.AppModule
Вкладка "Аргумент" >> Аргументы VM:
-Ddatastore.default_high_rep_job_policy_unapplied_job_pct = 50 -Xmx512m -javaagent: /home/myuser/sandbox/workbench/google/gae-sdk/1.7.1/appengine-java-sdk-1.7.1/lien/agent
Напоследок вопрос!
Когда я пытаюсь запустить эту конфигурацию, я получаю следующий вывод консоли:
Loading modules
com.mywebapp.client.modules.WebModule
[ERROR] Invalid name 'web-module'
[ERROR] Failure while parsing XML
com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries)
at com.google.gwt.dev.cfg.ModuleDefSchema$NullableNameAttrCvt.convertToArg(ModuleDefSchema.java:1048)
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:294)
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.XMLDocumentScannerImpl$ContentDispatcher.scanRootElementHook(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:347)
at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.access$200(ReflectiveParser.java:68)
at com.google.gwt.dev.util.xml.ReflectiveParser.parse(ReflectiveParser.java:418)
at com.google.gwt.dev.cfg.ModuleDefLoader.nestedLoad(ModuleDefLoader.java:296)
at com.google.gwt.dev.cfg.ModuleDefLoader$1.load(ModuleDefLoader.java:198)
at com.google.gwt.dev.cfg.ModuleDefLoader.doLoadModule(ModuleDefLoader.java:324)
at com.google.gwt.dev.cfg.ModuleDefLoader.loadFromClassPath(ModuleDefLoader.java:156)
at com.google.gwt.dev.DevModeBase.loadModule(DevModeBase.java:992)
at com.google.gwt.dev.DevMode.loadModule(DevMode.java:557)
at com.google.gwt.dev.DevMode.doStartup(DevMode.java:443)
at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1058)
at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811)
at com.google.gwt.dev.DevMode.main(DevMode.java:311)
[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:371)
at com.google.gwt.dev.util.xml.ReflectiveParser$Impl.access$200(ReflectiveParser.java:68)
at com.google.gwt.dev.util.xml.ReflectiveParser.parse(ReflectiveParser.java:418)
at com.google.gwt.dev.cfg.ModuleDefLoader.nestedLoad(ModuleDefLoader.java:296)
at com.google.gwt.dev.cfg.ModuleDefLoader$1.load(ModuleDefLoader.java:198)
at com.google.gwt.dev.cfg.ModuleDefLoader.doLoadModule(ModuleDefLoader.java:324)
at com.google.gwt.dev.cfg.ModuleDefLoader.loadFromClassPath(ModuleDefLoader.java:156)
at com.google.gwt.dev.DevModeBase.loadModule(DevModeBase.java:992)
at com.google.gwt.dev.DevMode.loadModule(DevMode.java:557)
at com.google.gwt.dev.DevMode.doStartup(DevMode.java:443)
at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:1058)
at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:811)
at com.google.gwt.dev.DevMode.main(DevMode.java:311)
[ERROR] shell failed in doStartup method
Может ли какой-нибудь гуру GWT определить, где моя конфигурация неверна (и объяснить, почему!)? Вывод исключений / ошибок здесь не очень описательный.
1 ответ
Имя в rename-to
должна быть пунктирной цепочкой допустимых идентификаторов Java. web-module
не является допустимым идентификатором Java (тире в нем).
Пытаться rename-to="webModule"
, rename-to="webmodule"
или же rename-to="web.module"
вместо этого, и, конечно, отрегулируйте <script>
в последствии тег на странице хоста HTML (webModule/webModule.nocache.js
, webmodule/webmodule.nocache.js
или же web.module/web.module.nocache.js
соответственно).
Это не имеет ничего общего с попыткой запустить несколько модулей или что-то еще.