2012-04-13 2 views
2

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

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

Можете ли вы мне помочь? Спасибо заранее.

+0

Ошибки, предупреждения, исключения, пример кода? Я могу успешно использовать библиотеку jacob с 32-битной и 64-битной виртуальной машиной, взаимодействующей с 32-битным COM-объектом (Word 2010 32bit). – Petesh

+0

Нет ошибок, никаких предупреждений, ничего. – mrod

+0

Нет ошибок, никаких предупреждений, ничего. Единственное, что я делаю: ActiveXComponent word = new ActiveXComponent («Word.Application»); word.setProperty («Видимый», новый вариант (true)); внутри файла jsp. Я также включаю com.jacob.com и com.jacob.activeX в верхней части страницы. На этом этапе я хочу только открыть окно процесса, но я вижу что-нибудь. – mrod

ответ

2

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

  1. Нарушение безопасности
  2. Неудовлетворенной Ошибка Ссылки
  3. Слово не установлен на сервере
  4. Некоторых другие ошибки загрузчика классов (редактировать)

Я пробовал с простой jsp, и применит 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

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

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

Который затем вызвавшей Word.Application.

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

+0

Я попытался создать исполняемый файл, который создает пустой файл doc (всегда используя библиотеку jacob). Он корректно работает как на моем компьютере (32 бит), так и на сервере (64 бит). Таким образом, проблема строго связана с открытием файла слов, то есть я не вижу файл doc, пока процесс был запущен. – mrod

+0

Под «см.», Вы имеете в виду видеть в пользовательском интерфейсе или видеть в файловой системе? Вы все еще не указали, какой контекст безопасности контейнера сервлета (например, служба Windows, запущенный из сеанса рабочего стола), и делает ли файл, который вы намереваетесь создать, помещается в известное место, которое имеет разрешение на запись сервлетом контейнер – Petesh