ColdFusion 2016 Java ClassNotFoundException - PullRequest
2 голосов
/ 11 июля 2019

Я скачал файл jar PDFBox и поместил его в папку {application.home}\lib.PDFBox имеет несколько других вспомогательных файлов JAR.Я поместил их все в папку {application.home}\lib тоже.Я перезапустил службу ColdFusion 2016.
В моем файле кода у меня есть несколько очень простых тестовых строк.

  <cftry>

    <cfset local.pdfUnitObj = CreateObject("java", "org.apache.pdfbox.pdmodel")>
    <cfcatch type="any">
      <cfdump var="#cfcatch#" output="C:\inetpub\wwwroot\cfcatcherr.txt">       
    </cfcatch>
  </cftry>

В cfcatcherr.txt я получаю сообщение об ошибке java.lang.ClassNotFoundException: org.apache.pdfbox.pdmodel

В org.apache.pdfbox.pdmodel существует класс PDDocument.Я попытался сослаться на org.apache.pdfbox.pdmodel.PDDocuemtn, но он все еще дает мне ошибку.Я поместил все эти файлы в {application.home}\jre\lib и {application.home}\wwwroot\WEB-INF\lib.Ошибка все та же.Это потому, что я не разместил файл JAR в правильном месте?Кто-нибудь знает, как я могу решить эту проблему, пожалуйста?

1 Ответ

1 голос
/ 12 июля 2019

Предпочтительный метод для CF2016 +

Вместо того, чтобы разбираться с путем к классу и каждый раз перезагружать сервер, существует более простая опция для CF2016 +. Динамически загружайте банки в ваш Application.cfc, используя this.javaSettings . Параметр LoadPaths принимает массив из одного или нескольких каталогов (содержащих файлы jar для загрузки):

component {
    this.name = "YourAppName";
    // loads all jars in the subdirectories named "lib" and "ext"
    this.javaSettings = { LoadPaths = [ ".\lib\", ".\ext\" ] };
}

.. или укажите массив отдельных путей к файлам jar:

component {
    this.name = "YourAppName";
    // loads individual jars 
    this.javaSettings = { LoadPaths = [ "C:\path\to\pdfbox-2.0.16.jar"
                                        , "C:\path\to\xmpbox-2.0.16.jar"
                                        , .. more paths
                                      ]
                        };
}

Адриан Дж. Морено также указал еще одно преимущество этого подхода:

Гораздо проще проверить JAR-файлы с помощью вашей базы кода и развернуть на серверы вместо того, чтобы документировать для DevOps, чтобы не забыть поставить JAR X в местоположении Y, если вам нужно обновить или построить новый сервер.


Старый метод

Однако, чтобы ответить на ваши предыдущие вопросы, наиболее распространенные причины ClassNotFoundException:

  1. Неверное имя класса

    CreateObject ожидает имя класса (cAsE sEnSiTiVe).

  2. Jar-файлы не находятся в пути класса CF

    Помимо основных путей JVM, CF сканирует только местоположения, перечисленные в Server Settings > ColdFusion Class Path. Файлы Jar, размещенные в другом месте, не будут обнаружены. (Путь к классу CF по умолчанию включает каталог WEB-INF\lib)

    Размещение нескольких копий библиотеки в пути к классам может иногда вызывать ошибки. Хотя по моему опыту эта проблема обычно вызывает другую ошибку.

  3. Забыл перезапустить CF-сервер

    Помимо основных путей JVM, сервер CF сканирует только пути к классам при запуске. Таким образом, сервер CF должен быть перезапущен, чтобы обнаружить любые новые банки.

Ваша ошибка вызвана # 1 - неверное имя класса. org.apache.pdfbox.pdmodel - это имя пакета - не класса. Имя класса должно быть org.apache.pdfbox.pdmodel.PDDocument ( обратите внимание на написание PDDocument ).

...