2011-12-05 28 views
0

本質上,我想壓縮jar文件中的共享對象的集合,在運行時將它們解壓縮到臨時目錄,然後從那裏。說,例如我有庫:如何將庫解壓縮到臨時目錄,從該目錄加載它及其所有依賴關係

  • libApp.so
  • libBasicPlugin.so => libApp.so
  • libPlugin1.so => libApp.so,libBasicPlugin.so,libPlugin2.so
  • libPlugin2.so => libApp.so,libBasicPlugin.so

的Java解壓他們任意的,唯一的臨時目錄$ USER_HOME /。我的應用程序內/ 2011_12_05_001 /,然後加載libApp.so,又使用dlopen加載libPlugin1和libPlugin2(libBasicPlugin是未明確加載)。問題是libPlugin1不知道在哪裏可以找到libBasicPlugin和libPlugin2。

這裏有各種解決方案我已經試過/考慮:

  1. 把庫中的已知位置和設置LD_LIBRARY_PATH在SH文件調用java之前。這可行,但不包括將庫封裝在一個罐子裏
  2. 使用Java的System.load來「預加載」依賴關係。這是我見過的方法,但只有在先知道哪些插件將被加載並知道它們的依賴關係時纔會起作用。除非您遍歷目錄中的所有文件,否則加載它們直到您停止獲取UnsatisfiedLinkExceptions ...
  3. 以某種方式告訴共享對象其依賴關係將位於同一目錄中(通過DT_RPATH?)。這是我想在理想世界中所期望的,但似乎最好的辦法是設置庫相對於可執行文件的位置,在本例中爲/usr/lib/jvm/.../java。
  4. 靜態鏈接每個庫及其依賴項。我擔心這會導致兩個libPlugin2(一個動態的和一個靜態的)拷貝,這對我們過去造成了各種各樣的問題。

在Windows上,在加載插件之前調用SetDllDirectory可以很好地解決這個問題。有什麼解決方案可以忽略/誤解?我是否完全用錯誤的方式來解決這個問題?

回答

0

您可以在Java進程本身內設置LD_LIBRARY_PATH env var。

+0

嗯謝謝你,我有同樣的想法,但Linux在第一次運行應用程序時會緩存LD_LIBRARY_PATH - 它不能在運行時修改。 http://stackoverflow.com/questions/856116/changing-ld-library-path-at-runtime-for-ctypes – kylewm

+0

好的。太可惜了。 –

相關問題