2012-04-13 40 views
2

我有一個java web應用程序,它使用jacob庫(運行在32位和64位)創建/打開word文件。它正確運行在我的機器上(32位),這意味着應用程序一詞已啓動並且文件文件已打開。 在服務器計算機(64位)上加載java項目時出現問題:應用程序將啓動(我在任務管理器窗口中看到「WINWORD.EXE * 32」),但文件未打開。雅各 - Word文件正確打開在32位,而不是在64位

我不明白我錯過了什麼。

可以幫我嗎? 在此先感謝。

+0

錯誤,警告,例外,代碼示例?我可以成功地將jacob庫與32位和64位虛擬機進行通信,並與32位COM對象(Word 2010 32位)進行通信。 – Petesh 2012-04-13 14:08:02

+0

沒有錯誤,沒有警告,什麼都沒有。 – mrod 2012-04-13 14:32:39

+0

沒有錯誤,沒有警告,什麼都沒有。我做的唯一的事情是:ActiveXComponent word = new ActiveXComponent(「Word.Application」); word.setProperty(「Visible」,new Variant(true));在一個jsp文件裏面。我還在頁面的頂部添加了com.jacob.com和com.jacob.activeX。在這一步我只想選擇過程開放,但我看到任何東西。 – mrod 2012-04-13 14:39:51

回答

2

我強烈懷疑下列情況之一發生了:

  1. 安全衝突
  2. 不合適的鏈接錯誤
  3. 字沒有在服務器
  4. 一些其他的類加載器的錯誤安裝(編輯

我試着用一個簡單的jsp,並直接調用LibraryLoader一個try-catch塊:

try { 
    LibraryLoader.loadJacobLibrary(); 
    ActiveXComponent oWord = new ActiveXComponent("Word.Application"); 
    oWord.setProperty("Visible", new Variant(true)); 
} catch (Throwable th) { 
    th.printStackTrace(new java.io.PrintWriter(out)); 
} 

,並擊中未能初始化JacobObject級 - 造成的,因爲安全衝突從靜態調試初始化的:"true".equalsIgnoreCase(System.getProperty("com.jacob.debug"));。一旦我用一個簡單的賦值替換爲true,並將其替換爲jacob.jar,我最終得到了:java.lang.UnsatisfiedLinkError: no jacob-1.16-x64 in java.library.path

這就是事情變得毛茸茸的。你可能不得不更換的東西,如更換方法loadJacobLibrary的LibraryLoader代碼:

public static void loadJacobLibrary() { 
    System.load("C:/<path to .dll as known on the server>/" + getPreferredDLLName() + ".dll"); 
} 

然後調用Word.Application

編輯對於一些其他的類加載器的錯誤,潛在的問題是,你只能加載.dll within the server的一個實例 - 這是指使用Tomcat,但問題是與所有其他的servlet容器類似 - 您只需要加載一次.dll,並且爲了確保代碼在所有servlet中都可用,需要將其加載到不會因重新加載Web應用程序而受到干擾的類加載器中。如果發生這種情況,那麼在服務器應用程序重新加載之前,您將無法使用.dll。

+0

我試圖創建一個可執行文件,它創建一個空的doc文件(總是使用jacob庫)。它可以在我的機器(32位)和服務器(64位)上正常運行。所以這個問題與文件的打開是緊密相關的,也就是說當進程已經啓動的時候,我看不到doc文件。 – mrod 2012-04-18 07:38:34

+0

'看',你的意思是在用戶界面上看到或在文件系統上看到?您仍然沒有說明servlet容器(例如,從桌面會話啓動的Windows服務)的安全上下文以及您打算創建的文件是否放置在有權限被servlet寫入的已知位置容器 – Petesh 2012-04-18 07:57:01

相關問題