2016-09-15 99 views
1

我有一個彈簧啓動的web應用程序,我想打包爲自我可執行的jar文件。我已經按照referencejava -jar myapp.jar中所述配置了插件,表明該應用正在嘗試啓動。與DLL彈簧啓動可執行文件的可執行文件

然而,我的應用程序需要一個DLL,所以我加了靜態塊我的servlet初始化內:

public class DllUsageWebApp extends SpringBootServletInitializer { 
    static { 
     System.loadLibrary("TheLibrary.dll"); 
    } 
    public static void main(String[] args) { 
     SpringApplication.run(DllUsageWebApp .class, args); 
    } 

} 

但我收到UnsatisfiedLinkError例外。

如何將DLL添加到嵌入式tomcat服務器?

回答

3

我懷疑你的DLL庫包含在JAR文件中,並且可以從classpath加載;如果是這種情況,您只需要將該庫複製到文件系統的某處,然後從中讀取。

public class DllUsageWebApp extends SpringBootServletInitializer { 
    static { 
     String tempLibraryFile = 
      copyResourceToTempDirFile("/path/to/dll/in/JAR", "my.dll"); 
     System.load(tempLibraryFile.absolutePath()); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(DllUsageWebApp .class, args); 
    } 

    public static File copyResourceToTempDirFile(
     String resourcePath, String destinationFileName) { 
     File tempDir = new File(System.getProperty("java.io.tmpdir")); 
     File tempDirFile = new new File(tempDir, destinationFileName); 
     try (InputStream input = resourceAsStream(resourcePath); 
      OutputStream output = new FileOutputStream(tempDirFile)) { 
      IOUtils.copy(input, output); 
      tempDirFile.deleteOnExit(); 
      return tempDirFile; 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
+1

我認爲應該是'load'而不是'loadLibrary'。 AFAIK,後者要求庫在'java.library.path'上可用,而前者需要一個文件名。 –

+0

確實,感謝您的收穫! –