ColdFusion 2016 Java ClassNotFoundException

时间:2019-07-11 20:51:30

标签: java coldfusion pdfbox coldfusion-2016

我已经下载了PDFBox jar文件并将其放置在{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 个答案:

答案 0 :(得分:1)

CF2016 +的首选方法

CF2016 +提供了一个更简单的选项,而不是浪费类路径并不必每次都重新启动服务器。使用this.javaSettings在您的Application.cfc中动态加载jar。 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
                                      ]
                        };
}

Adrian J. Moreno also pointed out这种方法的另一个优点:

  

使用代码库更轻松地检查JAR并将其部署到   服务器,而不必为DevOps记录文档以记住放置   如果您需要升级或构建新服务器,则Y位置的JAR X。


旧方法

但是,要回答您先前的问题,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服务器才能检测到任何新的jar。

您的错误是由#1引起的-类名错误。 org.apache.pdfbox.pdmodel程序包的名称-不是类。类名应为org.apache.pdfbox.pdmodel.PDDocument注意PDDocument的拼写)。