我维护一个 GWT 多模块 Maven 项目,其历史可以追溯到美好的黄金 GWT 时代。 到目前为止,我们能够依靠经典开发模式调试 GWT 应用程序,但现在由于 出于安全考虑,我们正在尝试设置我们的开发环境(Eclipse IDE)以使用超级开发模式。
但是当涉及到开发时,因此运行超级开发模式,当我们尝试启动CodeServer时,我们遇到了bindException(端口冲突)。
请在下面找到使用的配置以及我们遇到的异常:
超级开发模式(启动器配置)
main class: com.google.gwt.dev.DevMode
-logLevel INFO -port 8889 -remoteUI "${gwt_remote_ui_server_port}:${unique_id}" -codeServerPort 9997 -war {directory to web app} -workDir {work directory} {module}
观察:
超级开发模式正确启动并已配置为在端口 9997 上运行:
http://127.0.0.1:8889/app.html
下一步是我尝试启动 CodeServer:
CodeServer(启动器配置)
main class: com.google.gwt.dev.codeserver.CodeServer
-logLevel INFO -port 9876 -workDir {work directory} -src src/ {module}
观察:
出现以下异常,随后代码服务器从未启动。
[main] 警告 org.eclipse.jetty.util.component.AbstractLifeCycle - 失败 ServerConnector@5c168f93{HTTP/1.1}{127.0.0.1:9876}:java.net.BindException:地址已在使用中 java.net.BindException:地址已在使用中
从那里,我看不到其他线索(错误输出或堆栈跟踪)。 到目前为止,在这个问题上花了三天时间后,我们似乎遇到了麻烦。
我的疑问如下:
如果您面临类似的障碍,很乐意分享我的发现。
最好的,贾维德
p.s.:在 Java 8 环境中,我能够使用 GWT 2.9.0,它是超级开发模式(通过 Eclipse 和 thomas broyer 的 gwt-maven-plugin)。 @tbroyer p.s: 当访问模块网页时,它仍然在端口 9876 上连接到 codeserver(尽管 codeserver 已配置为在 9877 上运行)
首先需要澄清一点:
CodeServer
是超级开发模式,就像DevMode
一样。 CodeServer
和 DevMode
之间的主要区别在于 DevMode
also 默认在端口 8888 上启动一个简单的应用程序服务器。
因此,您不应在同一个项目中同时运行
CodeServer
和 DevMode
。如果您同时运行两个项目,自然会出现某种冲突,因此需要选择不同的端口。话虽如此,CodeServer/DevMode 能够同时运行多个模块,只要它们的类路径兼容即可。
最后,运行
DevMode
来运行内置 Jetty 在 GWT 中已被弃用(并且在 net.ltgt.gwt.maven
插件中也不鼓励使用,请参阅 https://github.com/tbroyer/gwt-maven-archetypes/? tab=readme-ov-file#start-the-development-mode - Windows 除外,除非您应用链接问题的解决方法) - 相反,运行您自己的开发服务器,使用 CodeServer
的 launcherDir
(或 DevMode 的warDir
)设置为创建 JS 内容,您自己的开发服务器可以在浏览器更改时提供给浏览器(就像您手动编辑 js/html/css 或使用 npm/etc 一样)。
如果上述方法不能解决您的问题,您可能会遇到这样的问题:即使服务器已停止,浏览器仍保持连接到端口
9876
,因此您无法重新启动服务器。我已提交 https://github.com/gwtproject/gwt/issues/9944 并将很快发布补丁来解决此问题。
这是完整的堆栈跟踪,它显示 CodeServer 作为 DevMode 的一部分被调用,完成自己的工作(并显示您所看到的异常):
[java] java.io.IOException: Failed to bind to /127.0.0.1:9876
[java] at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:349)
[java] at org.eclipse.jetty.server.ServerConnector.open(ServerConnector.java:310)
[java] at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:80)
[java] at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:234)
[java] at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
[java] at org.eclipse.jetty.server.Server.doStart(Server.java:401)
[java] at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73)
[java] at com.google.gwt.dev.codeserver.WebServer.start(WebServer.java:138)
[java] at com.google.gwt.dev.codeserver.CodeServer.start(CodeServer.java:162)
[java] at com.google.gwt.dev.codeserver.CodeServer.main(CodeServer.java:104)
[java] at com.google.gwt.dev.codeserver.CodeServer.main(CodeServer.java:55)
[java] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
[java] at java.base/java.lang.reflect.Method.invoke(Method.java:580)
[java] at com.google.gwt.dev.shell.SuperDevListener.runCodeServer(SuperDevListener.java:112)
[java] at com.google.gwt.dev.shell.SuperDevListener.start(SuperDevListener.java:91)
[java] at com.google.gwt.dev.DevMode.ensureCodeServerListener(DevMode.java:666)
[java] at com.google.gwt.dev.DevModeBase.doStartup(DevModeBase.java:785)
[java] at com.google.gwt.dev.DevMode.doStartup(DevMode.java:551)
[java] at com.google.gwt.dev.DevModeBase.startUp(DevModeBase.java:888)
[java] at com.google.gwt.dev.DevModeBase.run(DevModeBase.java:705)
[java] at com.google.gwt.dev.DevMode.main(DevMode.java:432)
[java] Caused by: java.net.BindException: Address already in use
[java] at java.base/sun.nio.ch.Net.bind0(Native Method)
[java] at java.base/sun.nio.ch.Net.bind(Net.java:565)
[java] at java.base/sun.nio.ch.ServerSocketChannelImpl.netBind(ServerSocketChannelImpl.java:344)
[java] at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:301)
[java] at java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:89)
[java] at org.eclipse.jetty.server.ServerConnector.openAcceptChannel(ServerConnector.java:344)
[java] ... 20 more