ColdFusion 2016 Java ClassNotFoundException

Я скачал 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 в правильное место? Кто-нибудь знает, как я могу решить эту проблему, пожалуйста?


person Monte Chan    schedule 11.07.2019    source источник
comment
Что такое {application.home}?   -  person SOS    schedule 12.07.2019
comment
c:\coldfusion2016\cfusion   -  person Monte Chan    schedule 12.07.2019
comment
Опубликованная ошибка связана с тем, что org.apache.pdfbox.pdmodel - это имя пакета, а не класса. Имя класса должно быть org.apache.pdfbox.pdmodel.PDDocument (обратите внимание на написание PDDocument). Кроме того, пожалуйста, опубликуйте полную трассировку стека, а не только первую его строку.   -  person SOS    schedule 12.07.2019
comment
поместил все эти файлы в ...\jre\lib и ...\WEB-INF\lib ... Не помещайте несколько копий jar в путь к классу. Их следует размещать только в одном месте, например {cf web root}\WEB-INF\lib. Однако... сказав это, для CF2016 проще пропустить все это и просто загрузить их в свой файл Application.cfc с this.javaSettings.   -  person SOS    schedule 12.07.2019
comment
На 100% согласен с @Ageax по поводу javaSettings. Гораздо проще зарегистрировать JAR-файлы в базе кода и развернуть их на серверах вместо того, чтобы документировать DevOps, чтобы не забыть поместить JAR-файл X в местоположение Y, если вам нужно обновить или построить новый сервер.   -  person Adrian J. Moreno    schedule 12.07.2019


Ответы (1)


Предпочтительный метод для 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).

person SOS    schedule 12.07.2019
comment
Большое спасибо! Проблема в неправильном названии класса - person Monte Chan; 15.07.2019