2013-02-27 3 views
0

Я пытаюсь создать простой сервлет 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

+0

добавить сервлет .jar к вашему пути к классам. надеюсь, что это работает. Если вы используете eclipse, вы можете добавить его как внешнюю попытку lib. –

+0

спасибо за повтор, можете ли вы уточнить, что я должен делать? – user878813

+0

Я считаю, что вы получаете ошибку с 'System.loadLibrary (" calldll ");'. Поймать исключения, вызванные методом loadLibrary. Это поможет найти точную причину ошибки. –

ответ

0

Если веб-приложение размещается в TOMCAT сервере приложений скопировать DLL в папку BIN, то в вашем использовании сервлетов:

System.load(System.getProperty("catalina.base")+"/bin/yourdll.dll"); 
Смежные вопросы