У меня ОЧЕНЬ простой веб-сервер, который принимает клиентские соединения, получает статические веб-страницы и сервлеты служб.
Я написал веб-сервер на 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 для окон", если вы мне не верите.