2

我有一个 java web 应用程序,它使用 jacob 库(在 32 位和 64 位中运行)来创建/打开 word 文件。它在我的机器(32位)上正确运行,这意味着启动了word应用程序并打开了word文件。在服务器机器(64位)上加载java项目时出现问题:将启动word应用程序(我在任务管理器窗口看到“WINWORD.EXE * 32”),但文件没有打开。

我不明白我错过了什么。

你能帮帮我吗?提前致谢。

4

1 回答 1

2

我强烈怀疑正在发生以下事情之一:

  1. 安全违规
  2. 不满意的链接错误
  3. 服务器上未安装 Word
  4. 其他一些类加载器错误(编辑

我尝试了一个简单的 jsp,并直接在 try-catch 块中调用了 LibraryLoader:

 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"));. 一旦我用一个简单的赋值来替换它,并在 jacob.jar 中替换它,我最终得到了:java.lang.UnsatisfiedLinkError: no jacob-1.16-x64 in java.library.path

正是在这一点上,事情变得多毛了。您可能必须将替换该方法的 LibraryLoader 代码替换为loadJacobLibrary

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

然后调用Word.Application.

编辑对于其他一些类加载器错误,根本问题是您只能在服务器中加载 .dll 的一个实例- 这是指使用 tomcat,但问题与所有其他 servlet 容器相似 - 您需要加载 . dll 仅一次,并且为了确保代码在所有 servlet 中可用,需要将其加载到不会因重新加载 Web 应用程序而受到干扰的类加载器中。如果发生这种情况,那么在重新加载服务器应用程序之前,您将无法使用 .dll。

于 2012-04-13T16:22:32.633 回答