雅各 - Word文件正确打开在32位,而不是在64位

雅各 - Word文件正确打开在32位,而不是在64位

问题描述:

我有一个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

我强烈怀疑下列情况之一发生了:

  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