Jacob - файл Word правильно открыт в 32-битной, а не в 64-битной

У меня есть веб-приложение java, которое использует библиотеку jacob (работает как в 32-битной, так и в 64-битной версиях) для создания / открытия файлов слов. Он корректно работает на моей машине (32 бита), это означает, что приложение word запущено и файл word открыт. Проблема возникает, когда проект java загружен на сервер (64-битный компьютер): будет запущено приложение word (я вижу "WINWORD.EXE * 32" в окне диспетчера задач), но файл не открывается.

Я не понимаю, чего мне не хватает.

Вы можете мне помочь? Заранее спасибо.

1 ответ

Решение

Я сильно подозреваю, что происходит одна из следующих вещей:

  1. Нарушение безопасности
  2. Неудовлетворенная ошибка связи
  3. Word не установлен на сервере
  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

Именно в этот момент все становится волосатым. Возможно, вам придется заменить код LibraryLoader, который заменил метод loadJacobLibrary с чем-то вроде:

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

Который затем призвал Word.Application,

edit Для некоторой другой ошибки загрузчика классов основная проблема заключается в том, что вы можете загрузить только один экземпляр.dll на сервере - это относится к использованию tomcat, но проблема аналогична всем остальным контейнерам сервлетов - вам нужно загрузить. dll только один раз, и для того, чтобы код был доступен для всех сервлетов, его необходимо загрузить в загрузчик классов, который не будет нарушен при перезагрузке веб-приложения. Если это произойдет, вы не сможете использовать.dll до тех пор, пока приложение сервера не будет перезагружено.

Другие вопросы по тегам