Неудовлетворенная ошибка связи, несмотря на то, что dll находится в правильном каталоге - PullRequest
0 голосов
/ 29 ноября 2018

Совершенно потерянный здесь.Итак, у меня есть это приложение Spring, которое при запуске загружает мою .dll (специальную) в основной класс таким образом:

static {
    File f = new File("src/lib/lib.dll");
    if(f.exists() && !f.isDirectory()) {
        String libDllPath = f.getParentFile().getAbsolutePath();
        log.info("libDllPath: {}", libDllPath);
        System.setProperty( "java.library.path", libDllPath);
        Field fieldSysPath = null;
        try {
            fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
            fieldSysPath.setAccessible( true );
            fieldSysPath.set( null, null );
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
        log.info("\"java.library.path\" : {}", System.getProperty("java.library.path"));
        System.loadLibrary("lib");
    }
    else {
        log.error("Lib has not been loaded.");
        System.exit(-1);
    }
}

Этот кусок кода работает хорошо, если я запускаю приложение изIntelliJ и .dll на самом деле загружаются так, как это было предложено здесь https://stackoverflow.com/a/6909689/3045845

Вывод для регистраторов:

11:14:39.287 [main] INFO  com.spring.application- libDllPath: D:\Workspace\whatever\spring-application\src\lib
11:14:39.289 [main] INFO  com.whatever - "java.library.path" : D:\Workspace\whatever\spring-application\src\lib

Для записи это каталог проектаtree:

src
|----lib
      |----lib.dll
|----main
      |----java
             |----com.main.package
      |----resources
|----test

Итак, я создал файл jar из этого приложения с помощью Gradle и попытался развернуть приложение на Windows Server 2012, поскольку это целевая ОС для этого приложения.

Там я развертываю файл jar в какой-то папке по умолчанию, используя java -jar spring-application-1.0-SNAPSHOT.jar (я пытался развернуть тот же самый jar под Windows10, где я разрабатываю приложение - работает как чудо), и вот что я получаю:

C:\Users\user\Downloads>java -jar spring-application-1.0-SNAPSHOT.jar
11:27:55.841 [main] INFO  com.spring.application - libDllPath: C:\Users\user\Downloads\src\lib
11:27:55.853 [main] INFO  com.spring.application - "java.library.path" : C:\Users\user\Downloads\src\lib
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\user\Downloads\src\lib\lib.dll: Can't find dependent libraries
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(Unknown Source)
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.load0(Unknown Source)
        at java.lang.System.load(Unknown Source)
        at com.spring.application.<clinit>(SpringApplication.java:51)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)

Я проверяю, действительно ли у меня есть .dll в каталоге, который я делаю.

Я также попытался запустить jar с -Djava.library.path=, установленным в каталог с .dll, но та же историяслучатьсяs.

Может кто-нибудь сказать мне, что здесь происходит?

1 Ответ

0 голосов
/ 29 ноября 2018

Так что, очевидно, причина того, что он не работал, заключалась в том, что сама dll зависела как от MSCVP120D.dll, так и от MSCVR120D.dll.Я использовал программу Dependency Walker, чтобы отследить, что в Windows Server 2012 оба эти dll не были доступны.

Чтобы преодолеть это, компиляция с использованием компилятора Visual Studio 2013 (C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat) должна выполняться вместе с /MTd пометить как объяснено в этом посте: https://stackoverflow.com/a/32085978

...