我有一个java Web应用程序,它使用jacob库(在32位和64位中运行)来创建/打开word文件。它在我的机器(32位)上正确运行,这意味着word应用程序已启动并且word文件已打开。 当在服务器计算机(64位)上加载java项目时出现问题:单词应用程序将启动(我在任务管理器窗口中看到“WINWORD.EXE * 32”),但文件未打开。
我不明白我错过了什么。
你可以帮我吗? 提前致谢。
最佳答案
我强烈怀疑正在发生以下事情之一:
- 违反安全规定
- 不满意的链接错误
- 服务器上未安装 Word
- 其他一些类加载器错误(编辑)
我尝试使用一个简单的 jsp,并直接在 try-catch block 中调用 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"));
.一旦我用简单的 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,直到重新加载服务器应用程序为止。
关于java - Jacob - Word 文件可以在 32 位中正确打开,但不能在 64 位中正确打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10138630/