programing

java.lang.UnsatisfiedLinkError java.library.path에 *****. dll 없음

nasanasas 2020. 9. 9. 08:06
반응형

java.lang.UnsatisfiedLinkError java.library.path에 *****. dll 없음


웹 애플리케이션에서 사용자 지정 dll 파일을로드하려면 어떻게해야합니까? 나는 다음과 같은 방법을 시도했지만 실패했습니다.

  • system32폴더에 필요한 모든 dll을 복사하고 Servlet생성자 에서 그중 하나를로드하려고했습니다.System.loadLibrary
  • tomcat_home/shared/lib에서 필요한 dll을 복사했습니다.tomcat_home/common/lib
  • 이 모든 dll은 WEB-INF/lib웹 응용 프로그램에 있습니다.

위해서는 System.loadLibrary()일에, (윈도우, DLL을에) 라이브러리는 당신의 디렉토리의 어딘가에 있어야합니다 PATH 에 나열된 경로에 java.library.path(당신이 좋아하는 자바를 실행할 수 있도록 시스템 프로퍼티 java -Djava.library.path=/path/to/dir).

또한의 경우 끝에 loadLibrary()없는 라이브러리의 기본 이름을 지정합니다 .dll. 그래서, 대한 /path/to/something.dll, 그냥 사용합니다 System.loadLibrary("something").

당신은 또한 UnsatisfiedLinkError당신이 얻는 정확한 것을 볼 필요 가 있습니다. 다음과 같은 경우 :

Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path

그러면 또는 에서 foo 라이브러리 (foo.dll)를 찾을 수 없습니다 . 다음과 같은 경우 :PATHjava.library.path

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V

그러면 Java가 응용 프로그램의 기본 Java 기능을 실제 기본 대응 항목에 매핑 할 수 없다는 점에서 라이브러리 자체에 문제가 있습니다.

우선, System.loadLibrary()제대로 실행되는지 확인하기 위해 호출 주위에 로깅을 추가합니다 . 예외가 발생하거나 실제로 실행되는 코드 경로에 없으면 항상 UnsatisfiedLinkError위에서 설명한 후자 유형을 얻게됩니다 .

참고로, 대부분의 사람들은 loadLibrary()네이티브 메서드를 사용하여 클래스의 정적 초기화 블록에 호출을 넣어 항상 정확히 한 번 실행되도록합니다.

class Foo {

    static {
        System.loadLibrary('foo');
    }

    public Foo() {
    }

}

'java.library.path'변수는 JVM에서 한 번만 읽으므로 런타임에 변경하는 것만으로는 충분하지 않습니다. 다음과 같이 재설정해야합니다.

System.setProperty("java.library.path", path);
//set sys_paths to null
final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");
sysPathsField.setAccessible(true);
sysPathsField.set(null, null);

다음에서 전리품을 가져 가십시오 . 런타임에서 Java 라이브러리 경로 변경 .


Adam Batkin의 원래 답변은 솔루션을 제공하지만 웹 컨테이너를 다시 시작하지 않고 웹 앱을 다시 배포하면 다음 오류가 발생해야합니다.

java.lang.UnsatisfiedLinkError: Native Library "foo" already loaded in another classloader
   at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1715)
   at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646)
   at java.lang.Runtime.load0(Runtime.java:787)
   at java.lang.System.load(System.java:1022)

이것은 원래 DLL을로드 한 ClassLoader가 여전히이 DLL을 참조하기 때문에 발생합니다. 그러나 웹앱은 이제 새로운 ClassLoader로 실행되고 있으며 동일한 JVM이 실행 중이고 JVM은 동일한 DLL에 대한 2 개의 참조를 허용하지 않으므로 다시로드 할 수 없습니다 . 따라서 웹앱은 기존 DLL에 액세스 할 수 없으며 새 DLL을로드 할 수 없습니다. 그래서 .... 당신은 붙어 있습니다.

Tomcat의 ClassLoader 문서 는 새로 고침 된 웹앱이 새로운 격리 된 ClassLoader에서 실행되는 이유와이 제한을 해결하는 방법 (매우 높은 수준에서)을 설명합니다.

해결책은 Adam Batkin의 솔루션을 약간 확장하는 것입니다.

   package awesome;

   public class Foo {

        static {
            System.loadLibrary('foo');
        }

        // required to work with JDK 6 and JDK 7
        public static void main(String[] args) {
        }

    }

그런 다음이 컴파일 된 클래스를 포함하는 jar를 TOMCAT_HOME / lib 폴더에 넣습니다.

이제 웹앱 내에서 Tomcat이이 클래스를 참조하도록 강제해야합니다.이 작업은 다음과 같이 간단하게 수행 할 수 있습니다.

  Class.forName("awesome.Foo");

이제 DLL이 공통 클래스 로더에로드되어야하며 재배포 후에도 웹앱에서 참조 할 수 있습니다.

말이 되나?

작업 참조 사본은 Google 코드 static-dll-bootstrapper 에서 찾을 수 있습니다 .


System.load()각 OS의 표준 라이브러리 폴더에있는 파일이 아닌 원하는 절대 경로를 제공하는 데 사용할 수 있습니다 .

이미 존재하는 기본 애플리케이션을 원하는 경우 System.loadLibrary(String filename). 자신의 것을 제공하려면 load ()를 사용하는 것이 좋습니다.

당신은 또한 사용할 수 있어야합니다 loadLibrary으로 java.library.path올바르게 설정. ClassLoader.java확인중인 두 경로를 모두 보여주는 구현 소스를 참조하십시오 (OpenJDK).


In the case where the problem is that System.loadLibrary cannot find the DLL in question, one common misconception (reinforced by Java's error message) is that the system property java.library.path is the answer. If you set the system property java.library.path to the directory where your DLL is located, then System.loadLibrary will indeed find your DLL. However, if your DLL in turn depends on other DLLs, as is often the case, then java.library.path cannot help, because the loading of the dependent DLLs is managed entirely by the operating system, which knows nothing of java.library.path. Thus, it is almost always better to bypass java.library.path and simply add your DLL's directory to LD_LIBRARY_PATH (Linux), DYLD_LIBRARY_PATH (MacOS), or Path (Windows) prior to starting the JVM.

(참고 : DLL 또는 공유 라이브러리의 일반적인 의미에서 "DLL"이라는 용어를 사용하고 있습니다.)


현재 디렉토리와 같이 이미있는 일부 디렉토리에 상대적인 파일을로드해야하는 경우 다음과 같은 쉬운 해결책이 있습니다.

File f;

if (System.getProperty("sun.arch.data.model").equals("32")) {
    // 32-bit JVM
    f = new File("mylibfile32.so");
} else {
    // 64-bit JVM
    f = new File("mylibfile64.so");
}
System.load(f.getAbsolutePath());

찾는 분들을 위해 java.lang.UnsatisfiedLinkError: no pdf_java in java.library.path

나는 같은 예외에 직면했다. 나는 그것을 작동시키기 위해 모든 것을 시도했고 중요한 것은 다음과 같습니다.

  1. 올바른 버전의 pdf lib.jar (제 경우에는 서버 런타임에 잘못된 버전 jar가 보관되었습니다)
  2. 폴더를 만들고 그 안에 pdflib jar를 유지하고 PATH 변수에 폴더를 추가하십시오.

바람둥이 6에서 작동했습니다.


가난한 날 ! 하루 종일이 문제를 반복하는 사람이 있으면 여기에 적어 두었습니다.

Adam이 제안한대로로드하려고했지만 AMD64 대 IA 32 예외가 발생했습니다 .Adam 's (의심 할 여지없이 최고의 선택) 연습에 따라 작업 한 후 어떤 경우에도 최신 jre의 64 비트 버전을 사용해보십시오. JRE 및 JDK는 64 비트이며 클래스 경로에 올바르게 추가했습니다.

내 작업 예제는 여기에 있습니다 : unstatisfied link error


  1. 에 native lib 경로를 추가했다고 생각되면 다음을 사용하여 %PATH%테스트 해보세요.

    System.out.println(System.getProperty("java.library.path"))
    

dll이 켜져 있는지 실제로 보여줄 것입니다. %PATH%

  1. env 변수를 설정 한 후 작동하는 것으로 보이는 IDE Idea를 다시 시작하십시오. %PATH%

Windows의 경우 filles (jd2xsx.dll 호출 및 ftd2xx.dll)를 windowws / system32 폴더에로드했을 때 문제가 해결되었음을 알았습니다. 그런 다음 새 fd2xx.dll이 매개 변수와 관련하여 문제가 발생 하여이 dll의 이전 버전을로드해야했습니다. 나중에이 문제를 해결해야합니다.

참고 : jd2xsx.dll은 ftd2xx.dll을 호출하므로 jd2xx.dll의 경로 설정 만 작동하지 않을 수 있습니다.


저는 Mac OS X Yosemite와 Netbeans 8.02를 사용하고 있습니다. 동일한 오류가 발생하고 제가 찾은 간단한 해결책은 위와 같습니다. 프로젝트에 네이티브 라이브러리를 포함해야 할 때 유용합니다. Netbeans에 대해 다음을 수행하십시오.

1.- Right click on the Project
2.- Properties
3.- Click on RUN
4.- VM Options: java -Djava.library.path="your_path"
5.- for example in my case: java -Djava.library.path=</Users/Lexynux/NetBeansProjects/NAO/libs>
6.- Ok

누군가에게 유용 할 수 있기를 바랍니다. 솔루션을 찾은 링크는 다음과 같습니다. java.library.path – 정의 및 사용 방법


나는 같은 문제가 있었고 오류는 dll의 이름 변경으로 인한 것입니다. 라이브러리 이름도 dll 내부에 기록 될 수 있습니다. 원래 이름을 되 돌리면 다음을 사용하여로드 할 수있었습니다.System.loadLibrary


Windows의 명령 줄에 java -XshowSettings : properties를 작성한 다음 java.library.path에 표시된 경로에 모든 파일을 붙여 넣는 것은 간단합니다.


This is My java.library.path:

 java.library.path = C:\Program Files\Java\jdk1.7.0_51\bin
     C:\WINDOWS\Sun\Java\bin
     C:\WINDOWS\system32
     C:\WINDOWS
     C:\WINDOWS\system32
     C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\lib\idrskr
.lib
     C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSG
idgeDll.dll
     C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSG
aderDll.dll
     C:\Program Files\Java\jdk1.7.0_51\bin
     C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include
     C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib
     C:\WINDOWS\System32\Wbem
     C:\WINDOWS\System32\WindowsPowerShell\v1.0
     C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\
     C:\Program Files\Microsoft SQL Server\100\DTS\Binn

Still rror comes: 
infile >> D:\pdf_upload\pre_idrs15_win_temporary_license_activation_tutorial.pdf
outFile >> D:\pdf_upload\processed\pre_idrs15_win_temporary_license_activation_tutorial.txt
Hello : This is java library path:(NICKRJ) C:\Program Files\Java\jdk1.7.0_51\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:/Program Files/Java/jdk1.7.0_51/jre/bin/server;C:/Program Files/Java/jdk1.7.0_51/jre/bin;C:/Program Files/Java/jdk1.7.0_51/jre/lib/amd64;C:\WINDOWS\system32;C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\lib\idrskrn15.lib;C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSGEBridgeDll.dll;C:\Program Files\I.R.I.S. SA\iDRS_15_2_for_Win64_15_2_11_1717\bin\iDRMSGEReaderDll.dll;C:\Program Files\Java\jdk1.7.0_51\bin;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0;C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\;C:\Program Files\Microsoft SQL Server\100\DTS\Binn;D:\WorkSet\New folder\eclipse_kepler\eclipse;;.
Exception in thread "main" java.lang.UnsatisfiedLinkError: no iDRMSGEBridgeDll in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
    at java.lang.Runtime.loadLibrary0(Runtime.java:849)
    at java.lang.System.loadLibrary(System.java:1088)
    at com.bi.iDRMSGEBridgeDll.callOcr(iDRMSGEBridgeDll.java:78)
    at com.bi.iDRMSGEBridgeDll.main(iDRMSGEBridgeDll.java:15)


Here is my Java JNI class:

package com.bi;

import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

public class iDRMSGEBridgeDll  
{
  public native int iDRMSGEDll_Initialize(String strPropertiesFileName);
  public native int iDRMSGEDll_VerifyLicense();
  public native int iDRMSGEDll_ConvertFile(String strSourceFileName, String srcOutputFileName,  String formatType);
  public native int iDRMSGEDll_Finalize();

public static void main(String[] args)
{
    //iDRMSGEBridgeDll.callOcr("bgimage.jpg","jpg","","d:\\","d:\\","4");
    iDRMSGEBridgeDll.callOcr("pre_idrs15_win_temporary_license_activation_tutorial.pdf","pdf","","D:\\pdf_upload","D:\\pdf_upload\\processed","4");


    /*  System.loadLibrary("iDRMSGEBridgeDll");
        iDRMSGEBridgeDll obj = new iDRMSGEBridgeDll();
        if ( obj.iDRMSGEDll_Initialize("D:\\iris\\iDRSGEDll.properties") != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_Initialize success.");
        if ( obj.iDRMSGEDll_VerifyLicense() != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_VerifyLicense success.");
        if (obj.iDRMSGEDll_ConvertFile("E:\\UI changes File_by Shakti\\PDF\\S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1].pdf", 
            "E:\\SK_Converted_Files\\MVP_CONTRACTS\\Southwest CFM56-7\\S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1]\\S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1].txt", "4" ) != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_ConvertFile 1 success.");
        /*if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.pdf", 
            "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.out", 4) != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_ConvertFile 2 success.");
        if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.pdf", 
            "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.out", 4) != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_ConvertFile 3 success.");
        if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.pdf", 
            "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.out", 4) != 0 ) {
            obj.iDRMSGEDll_Finalize();
            return;
        }
        System.out.println("iDRMSGEDll_ConvertFile 4 success.");
        obj.iDRMSGEDll_Finalize();
        System.out.println("iDRMSGEDll_Finalize success.");
        return;*/

}
    public static String callOcr(String inputFile, String docType, String engineType, String filePath,String outputFolder,String type) throws RuntimeException
    {
        String message =  "";
        String formatType = type;           
        String inFile = filePath +"\\" +inputFile;
        String outFile="";
        if(type.equals("4"))
        outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".txt";
        else if(type.equals("6"))
            outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".rtf";
        else if(type.equals("9"))
            outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".pdf";
        else
            outFile = outputFolder +"\\"+inputFile.substring(0,inputFile.lastIndexOf("."))+".csv";

        System.out.println("infile >> "+inFile);
        System.out.println("outFile >> "+outFile);
        System.out.println("Hello : This is java library path:(NICKRJ) " +System.getProperty("java.library.path"));

        System.loadLibrary("iDRMSGEBridgeDll");
        //System.load("C:\\Program Files (x86)\\I.R.I.S. SA\\iDRS_15_2_for_Win64_15_2_11_1717\bin\\iDRMSGEBridgeDll.dll");
        //Runtime.getRuntime().loadLibrary("iDRMSGEBridgeDll");

            iDRMSGEBridgeDll obj = new iDRMSGEBridgeDll();
        try
        {
            if ( obj.iDRMSGEDll_Initialize("D:\\IRIS\\iDRSGEDll.properties") != 0 ) {
                obj.iDRMSGEDll_Finalize();
            //  return ; 
            }
            System.out.println("iDRMSGEDll_Initialize success.");
            if ( obj.iDRMSGEDll_VerifyLicense() != 0 ) {
                obj.iDRMSGEDll_Finalize();
        //      return;
            }
            System.out.println("iDRMSGEDll_VerifyLicense success.");
        //  formatType= JOptionPane.showInputDialog("Please input mark format type: ");
            if (formatType!=null && formatType.equals("4"))  {
                obj.iDRMSGEDll_ConvertFile(inFile, 
                        outFile, "4" ); 
                obj.iDRMSGEDll_Finalize();
        //      return;
            }
            else if(formatType!=null && formatType.equals("6")) {
                obj.iDRMSGEDll_ConvertFile(inFile, 
                        outFile, "6" ); 
                    obj.iDRMSGEDll_Finalize();
            //      return;
                }   
            else if(formatType!=null && formatType.equals("7")) {
                obj.iDRMSGEDll_ConvertFile(inFile, 
                        outFile, "7" ); 
                    obj.iDRMSGEDll_Finalize();
            //      return;
                }
            else if(formatType!=null && formatType.equals("9")) {
                obj.iDRMSGEDll_ConvertFile(inFile, 
                        outFile, "9" ); 
                    obj.iDRMSGEDll_Finalize();
            //      return;
                }
            else
            {
            message= "iDRMSGEDll_VerifyLicense failure";
            }

            System.out.println("iDRMSGEDll_ConvertFile 1 success.");
            /*if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.pdf", 
                "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_200dpi.out", 4) != 0 ) {
                obj.iDRMSGEDll_Finalize();
                return;
            }
            System.out.println("iDRMSGEDll_ConvertFile 2 success.");
            if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.pdf", 
                "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan1_300dpi.out", 4) != 0 ) {
                obj.iDRMSGEDll_Finalize();
                return;
            }
            System.out.println("iDRMSGEDll_ConvertFile 3 success.");
            if (obj.iDRMSGEDll_ConvertFile("C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.pdf", 
                "C:\\Software\\iDRS_15_1_7_2304\\sample_pdfs\\scan2_300dpi.out", 4) != 0 ) {
                obj.iDRMSGEDll_Finalize();
                return;
            }
            System.out.println("iDRMSGEDll_ConvertFile 4 success.");*/
            obj.iDRMSGEDll_Finalize();
            System.out.println("iDRMSGEDll_Finalize success.");
            if(message.length()==0)
            {
                message = "success";
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
            message = e.getMessage();
        }

        return message;





    }


}

참고 URL : https://stackoverflow.com/questions/1403788/java-lang-unsatisfiedlinkerror-no-dll-in-java-library-path

반응형