我有一个 java web 应用程序,它使用 jacob 库(在 32 位和 64 位中运行)来创建/打开 word 文件。它在我的机器(32位)上正确运行,这意味着启动了word应用程序并打开了word文件。在服务器机器(64位)上加载java项目时出现问题:将启动word应用程序(我在任务管理器窗口看到“WINWORD.EXE * 32”),但文件没有打开。
我不明白我错过了什么。
你能帮帮我吗?提前致谢。
我有一个 java web 应用程序,它使用 jacob 库(在 32 位和 64 位中运行)来创建/打开 word 文件。它在我的机器(32位)上正确运行,这意味着启动了word应用程序并打开了word文件。在服务器机器(64位)上加载java项目时出现问题:将启动word应用程序(我在任务管理器窗口看到“WINWORD.EXE * 32”),但文件没有打开。
我不明白我错过了什么。
你能帮帮我吗?提前致谢。
我强烈怀疑正在发生以下事情之一:
我尝试了一个简单的 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。