很多人都认为我使用的是IDE,所以现在让我说明一下:我不使用任何IDE。
我使用以下Java源代码,将其编译为Echo.class
,然后通过在Windows CMD中编写Echo.war
创建jar -cvf Echo.war Echo.class
,并将文件上传到$TOMCAT_HOME/webapps
文件夹中:
@ServerEndpoint("/echo")
public class Echo {
@OnMessage
public String echo(String incomingMessage) {
return "I recieved ('" + incomingMessage + "'), so I am returning it.";
}
}
启动Tomcat后,我突然有了以下文件夹结构:
<webapps>
...
<Echo.war>
<Echo>
<Echo.class>
<META-INF>
<MANIFEST.MF>
</META-INF>
</Echo>
</webapps>
尝试使用new WebSocket("ws://example.com:8080/Echo/echo")
的JavaScript打开到我的终端的websocket连接时,我得到404响应而不是101握手。
catalina.out
不再为空,管理员现在显示:{ {3}}
以下catalina.out
的内容太大,无法包含在此帖子中:
Echo.war
,650
,651
和690
上提及了 691
。
我研究了一下,看到如果你使用Java 8构建类,但是你的Tomcat在Java 7上运行,你将获得UnsupportedClassVersionError
。我没有得到这个错误,但我想我也可以更新到服务器上的Java 8。我这样做并重新部署了WAR,但没有任何改变。
我还将注释从@ServerEndpoint("/echo")
更改为@ServerEndpoint("/dest")
,以防有名称冲突,但这也没有帮助。
以下是http://pastebin.com/cwLviH5b的引用:
部署EchoServer WebSocket端点非常简单。 您需要编译源文件,在WAR中包含类文件 文件,并部署WAR文件。 Web容器将检测到这一点 WAR文件中包含一个WebSocket端点并执行 部署它的必要设置。完成这些步骤后,即可 准备好第一次调用WebSocket端点。
我认为我必须在里面创建一个带有单个类文件的WAR文件,但可能情况并非如此,因为他说&#34; WAR文件&#34; 和不是&#34;一个WAR文件&#34; 。
根据the book I am reading,WAR文件必须包含一个web.xml文件(有人可能想知道为什么他没有提到这个)。这是真的吗?这是为什么它不起作用?如果是,web.xml应该包含什么?当然,它不仅仅是一个名为&#34; web.xml&#34;。
的空文件答案 0 :(得分:6)
创建以下文件结构
WEB-INF
|
- classes
|
- Echo.class
从jar -cvf echo.war *
的父文件夹中WEB-INF
创建war文件。将此war文件部署到tomcat并尝试使用web-socket进行连接。
答案 1 :(得分:0)
从WAR文件的构建中删除javax.websocket库。
如果您正在使用maven设置依赖关系。例如:
<!-- Provided Websocket API, because tomcat has its own implementation -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
在Eclipse或IntelliJ中,您可以设置要使用WAR导出的库。
答案 2 :(得分:0)
你是如何编写课程的?编译类时,依赖库必须位于类路径中。这些库也必须在战争部署
下的WEB-INF / lib目录中