convert a simple maven websocket tyrus project to javac command line

117 Views Asked by At

Out of curiosity I'd like to build a simple websockets tyrus server chat project with javac and libraries in -classpath.

Yes, I know that this is not the standard way (mvn is), but I'm doing it as a proof of concept. I manage to get project built but it throws a NullPointerException

Code is:

ChatMain.java:

package chat;

import java.io.IOException; 
import java.util.Collections; 
import java.util.Map; 

import javax.websocket.DeploymentException; 

import org.glassfish.tyrus.server.Server; 

public class ChatMain { 

    public static void main(String[] args) throws DeploymentException, 
            IOException { 
        Map<String, Object> properties = Collections.emptyMap(); 
        Server server = new Server("localhost", 8080, "/ws", properties, 
                ChatEndPoint.class); 
        System.out.println(server);
        try { 
            server.start(); 
            System.in.read(); 
        } finally { 
            server.stop(); 
        } 
    } 
}

ChatEndPoint.java:

package chat;

import java.io.IOException;
import java.util.Map;
import java.util.HashMap;
import java.util.Collections;
import javax.websocket.OnClose; 
import javax.websocket.OnMessage; 
import javax.websocket.OnOpen; 
import javax.websocket.Session; 
import javax.websocket.server.ServerEndpoint; 
import org.json.*;

@ServerEndpoint("/chat") 
public class ChatEndPoint { 

    private static Map<String, Session> peers = Collections.synchronizedMap(new HashMap<String, Session>());

    @OnOpen 
    public void onOpen(Session peer) { 
        System.out.println("onOpen");
    } 

    @OnMessage 
    public void onMessage(String message, Session peer) throws IOException { 
        System.out.println("onMessage");
        JSONObject json = new JSONObject(message);
        String nick = (String) json.get("nick");
        boolean newClient = json.has("action") && ((String) json.get("action")).equals("add");
        synchronized(peers) {
            // Iterate over the connected sessions
            // and broadcast the received message
            for (Map.Entry<String, Session> entry : peers.entrySet()) {
                if (newClient) {
                    JSONObject json1 = new JSONObject(json, new String[] { "action" }).put("nick", entry.getKey());
                    peer.getBasicRemote().sendText(json1.toString());
                }
                entry.getValue().getBasicRemote().sendText(message);
            }
        }
        if (newClient)
            peers.put(nick, peer);
    } 

    @OnClose 
    public void onClose(Session peer) { 
        System.out.println("onClose");
        peers.values().remove(peer);
    } 
}

javac line:

javac -cp chat/javax.websocket-api-1.1.jar:chat/tyrus-server-1.12.jar:chat/tyrus-spi-1.12.jar:chat/tyrus-core-1.12.jar:chat/grizzly-framework-2.3.22.jar:chat/grizzly-http-server-2.3.22.jar:chat/tyrus-container-grizzly-server-1.12.jar:chat/json.jar: chat/ChatMain.java

java line:

java -cp chat/javax.websocket-api-1.1.jar:chat/tyrus-server-1.12.jar:chat/tyrus-spi-1.12.jar:chat/tyrus-core-1.12.jar:chat/grizzly-framework-2.3.22.jar:chat/grizzly-http-server-2.3.22.jar:chat/tyrus-container-grizzly-server-1.12.jar:chat/json.jar: chat.ChatMain

runtime error:

Exception in thread "main" java.lang.NullPointerException at org.glassfish.tyrus.container.grizzly.server.GrizzlyServerContainer$1.stop(GrizzlyServerContainer.java:228) at org.glassfish.tyrus.server.Server.stop(Server.java:231) at chat.ChatMain.main(ChatMain.java:23)

I understand that this can be done

1

There are 1 best solutions below

0
On

Interestingly, more libraries are needed. If I include all libraries in websocket-ri-archive-1.12.zip bundle, it works well. Definitely, a builder is the way to go