【问题标题】:Jacob - Word file correctly opened in 32bit and not in 64bitJacob - Word 文件以 32 位而不是 64 位正确打开
【发布时间】:2012-04-13 09:46:38
【问题描述】:

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

我不明白我错过了什么。

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

【问题讨论】:

  • 错误、警告、异常、代码示例?我可以成功地将 jacob 库与 32 位和 64 位 VM 一起使用,并与 32 位 COM 对象(Word 2010 32 位)进行通信。
  • 没有错误,没有警告,什么都没有。
  • 没有错误,没有警告,什么都没有。我唯一要做的是: ActiveXComponent word = new ActiveXComponent("Word.Application"); word.setProperty("可见", new Variant(true));在一个jsp文件中。我还在页面顶部添加了 com.jacob.com 和 com.jacob.activeX。在这一步我只想打开word process,但我什么都看到了。
  • 尝试直接调用 LibraryLoader - com.jacob.com.LibraryLoader.loadJacobLibrary();并将加载包装在 try-catch 块中。我强烈怀疑 .dll 没有被加载(丢失/不在 system.library.path/security 违规)

标签: java jsp 32bit-64bit jacob


【解决方案1】:

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

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

我尝试了一个简单的 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

到了这个时候,事情就变得棘手了。您可能必须将替换方法 loadJacobLibrary 的 LibraryLoader 代码替换为:

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

然后调用Word.Application。

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

【讨论】:

  • 我试图创建一个可执行文件,它会创建一个空的 doc 文件(总是使用 jacob 库)。它在我的机器(32 位)和服务器(64 位)上都能正常运行。所以这个问题与word文件的打开有严格的关系,也就是我看不到doc文件,而进程已经启动了。
  • “看到”是指在 UI 上看到还是在文件系统上看到?您还没有说明 servlet 容器的安全上下文(例如 windows 服务,从桌面会话启动),并且您打算创建的文件是否放置在有权由 servlet 写入的已知位置容器
猜你喜欢
  • 2015-09-12
  • 2016-07-13
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多