Совершенно потерянный здесь.Итак, у меня есть это приложение 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.
Может кто-нибудь сказать мне, что здесь происходит?