ColdFusion 2016 Java ClassNotFoundException

ColdFusion 2016 Java ClassNotFoundException,java,coldfusion,pdfbox,coldfusion-2016,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.pdmode

我已经下载了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文件放在正确的位置?有人知道我如何解决这个问题吗?

CF2016+的首选方法

CF2016+提供了一个更简单的选项,而不是在类路径上乱搞,每次都必须重新启动服务器。使用在Application.cfc中动态加载jar。
loadpath
参数接受一个或多个目录的数组(包含要加载的jar文件):

。。或者提供单个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编写文档以记住 如果您需要升级或构建一个新服务器,位置Y中的JAR X


旧方法

但是,为了回答您前面的问题,ClassNotFoundException最常见的原因是:

  • 错误的类名

    CreateObject需要一个类名(区分大小写)

  • Jar文件不在CF类路径中

    除了核心JVM路径之外,CF只扫描
    服务器设置>ColdFusion类路径中列出的位置。不会检测到放置在其他位置的Jar文件。(默认CF类路径包括
    WEB-INF\lib
    目录)

    在类路径中放置库的多个副本有时会导致错误。根据我的经验,这个问题通常会导致不同的错误

  • 忘记重新启动CF服务器

    除了核心JVM路径之外,CF服务器在启动时只扫描类路径位置。因此,必须重新启动CF服务器才能检测到任何新的JAR


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

    什么是
    {application.home}
    ?c:\coldfusion2016\cfusion发布的错误是因为
    org.apache.pdfbox.pdmodel
    是包的名称,而不是类。类名应该是
    org.apache.pdfbox.pdmodel.PDDocument
    (注意PDDocument的拼写)。另外,请发布完整的堆栈跟踪,而不仅仅是第一行。将所有这些文件放在…\jre\lib和…\WEB-INF\lib下。。。不要在类路径中放置JAR的多个副本。它们只能放在一个位置,如
    {cf web root}\web-INF\lib
    。然而。。。话虽如此,对于CF2016来说,跳过所有这些内容,只需将它们加载到Application.cfc文件中,并在
    javaSettings
    上使用.100%同意@Ageax即可。如果您需要升级或构建新的服务器,那么使用您的代码库检查JAR并将其部署到服务器上要容易得多,而不必为DevOps编写文档,以便记住将JAR X放在位置Y中。非常感谢!错误的类名是问题所在
    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
                                          ]
                            };
    }