Я пытаюсь создать простой сервлет Java, который запускается на сервере tomcat на моей машине.NoClassDefFoundError при попытке загрузить DLL в сервлет с tomcat
Мой сервлет код:
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class javaservlet
*/
@WebServlet(description = "java servlet", urlPatterns = { "/javaservlet" })
public class javaservlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public javaservlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter writer = response.getWriter();
calldll callingdll = new calldll();
ServletContext context = getServletConfig().getServletContext();
String path = context.getContextPath();
writer.println(path);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
и она отлично работает (не из calldll callingdll = new calldll();
части я объясню ниже, чем ошибка, я получаю там)
У меня также есть второй класс, который загружает DLL файл под названием «calldll.dll» (сделал всю работу с JAVAC, javah и прочее, и это работает) моя длл помещается в C:\apache-tomcat-7.0.37\wtpwebapps\myServlet\WEB-INF\lib
и я указал путь сборки родной там и мой класс код
public class calldll {
private native void print();
public static void main (String[] args){
new calldll().print();
}
static {
System.loadLibrary("calldll");
}
}
Мой с файл, в котором я сделал DLL из очень простой
#include<jni.h>
#include<stdio.h>
#include<windows.h>
#include "calldll.h"
JNIEXPORT void JNICALL
Java_calldll_print(JNIEnv*env,jobject obj)
{
printf("It Works!");
return;
}
, когда я бегу javaservlet где я называю вызов DLL класс, который загружает DLL я получаю это:
java.lang.NoClassDefFoundError: Could not initialize class calldll
javaservlet.doGet(javaservlet.java:33)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
странно, что когда я запускаю только класс java, появляется сообщение «Он работает», поэтому класс загружает dll успешно. Но когда, когда я создать экземпляр класса в сервлет оно не его из сервлета не что моя проблема ....
я добавил к calldll класса
улов (UnsatisfiedLinkError е) { System.err.println («Не удалось загрузить библиотеку родного кода. \ N" + e); }
, чтобы увидеть, если это проблема со статическими и я получаю следующую ошибку, когда я запустить сервлет
Native code library failed to load.
java.lang.UnsatisfiedLinkError: no calldll in java.library.path
но мой calldll класс, если я выполнить его самостоятельно, он все еще работает ... так, что происходит в сервлет, что я сделал не так: s
добавить сервлет .jar к вашему пути к классам. надеюсь, что это работает. Если вы используете eclipse, вы можете добавить его как внешнюю попытку lib. –
спасибо за повтор, можете ли вы уточнить, что я должен делать? – user878813
Я считаю, что вы получаете ошибку с 'System.loadLibrary (" calldll ");'. Поймать исключения, вызванные методом loadLibrary. Это поможет найти точную причину ошибки. –