Мой веб-сервер Java работает в Eclipse, но он падает каждый раз при запуске через командную строку - PullRequest
2 голосов
/ 26 января 2010

У меня ОЧЕНЬ простой веб-сервер, который принимает клиентские соединения, получает статические веб-страницы и сервлеты служб.

Я написал веб-сервер на Java и использую библиотеку tomcat для сервлетов. Я протестировал весь свой код, запустив его в IDE eclipse, и все работает нормально, но когда я запускаю свой код из командной строки, он запускает основной правильно, но как только я пытаюсь получить доступ к веб-странице через браузер (http://localhost/hello.html) тогда приложение вылетает, вот пример вывода:

p1>java p1Solution.WebServer 80
Waiting for a connection.
Servicing the connection.
Closing the connection and shutting down the executor.
Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/Servlet
Exception
        at p1Solution.WebServer.main(WebServer.java:54)
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletException
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        ... 1 more

Вот мой веб-сервер

public class WebServer {
    private static final ExecutorService executor = Executors.newCachedThreadPool();

    public static void main(String[] args) throws Exception {
        int port = (args.length > 0) ? Integer.parseInt(args[0]) : 80;

        // listen for clients on the port specified as a command line argument
        ServerSocket serverSocket = new ServerSocket(port);
        Socket connection = null;
        try {
            while (true) {
                try {
                    System.out.println("Waiting for a connection.");
                    // Wait for an in bound client connection
                    connection = serverSocket.accept();

                    System.out.println("Servicing the connection.");
                    // Handle the client connection in a separate thread
                    executor.execute(new ConnectionHandler(connection));
                } catch (Exception e) {
                    // Never crash the server
                    e.printStackTrace();
                }
            }
        }finally {
            System.out.println("Closing the connection and shutting down the executor.");
            connection = null;
            serverSocket.close();
            executor.shutdown();
            executor.awaitTermination(3, TimeUnit.SECONDS);
        }
    }
}

Я гуглил свое исключение, и некоторые люди упоминали кое-что о пути к классам, но я пока не нашел окончательного ответа. Когда я запускаю программу в Eclipse, все работает отлично!

Вот каталог моего проекта (где находится мой проект):

p1>ls
.classpath  bin           hello.html  p1Solution.jar
.project    coreservlets  p1Solution  testsuite

Вот содержимое каталога моего p1Solution (где находится код):

p1>ls p1Solution
ConnectionHandler.class           MyHttpServletRequest.class
ConnectionHandler.java            MyHttpServletRequest.java
HttpServletRequestAdapter.class   MyHttpServletResponse.class
HttpServletRequestAdapter.java    MyHttpServletResponse.java
HttpServletResponseAdapter.class  WebServer.class
HttpServletResponseAdapter.java   WebServer.java

Кто-нибудь может помочь мне решить эту проблему? Кто-нибудь видел эту проблему раньше?

P.S. И да, у меня есть команда 'ls' в Windows, и она не волшебная! Google "ls для окон", если вы мне не верите.

Ответы [ 2 ]

3 голосов
/ 26 января 2010

У вас есть удовлетворительная зависимость времени компиляции от javax.servlet.Servlet, которая, однако, отсутствует во время выполнения, следовательно, NoClassDefFoundError. Таким образом, вам нужно поместить реализацию этого класса в путь к классам (предоставленный Tomcat servlet-api.jar). Для этого рекомендуется использовать параметр -cp:

p1>java -cp c:\path\to\servlet-api.jar;. p1Solution.WebServer 80

Не забудьте "." (текущий каталог) в "-cp C:\path\to\servlet-api.jar;.". Также обратите внимание, что я не уверен, как обрабатываются пробелы в именах путей (я не под Windows, не могу проверить). Поэтому используйте либо короткие имена Windows 8.3 (например, C:\PROGRA~1\), либо не используйте пробелы в именах путей, либо переместите эту библиотеку в другое место.

2 голосов
/ 26 января 2010

Используйте функцию «Export -> Runnable Jar», чтобы создать файл jar с зависимыми библиотеками, включенными снизу и с должной ссылкой (поскольку у вас нет servlet.jar в вашем пути к классам во время выполнения). Тогда вы можете просто запустить

java -jar p1solution.jar
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...