ColdFusion 2016 Java ClassNotFoundException
ColdFusion 2016 Java ClassNotFoundException
我已经下载了 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
中,有一个PDDocumentclass。我试过引用 org.apache.pdfbox.pdmodel.PDDocuemtn
但它仍然给我错误。我已将所有这些文件放在 {application.home}\jre\lib
和 {application.home}\wwwroot\WEB-INF\lib
下。错误还是一样。是不是我没有把jar文件放在正确的位置?有人知道我该如何解决这个问题吗?
CF2016的首选方法+
CF2016+ 有一个更简单的选项,而不是每次都要重新启动服务器 class 路径。使用 this.javaSettings 在 Application.cfc 中动态加载 jars。 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
]
};
}
这种方法的另一个优点:
Much easier to check the JARs in with your code base and deploy to
servers instead of having to document for DevOps to remember to put
JAR X in location Y should you need to upgrade or build a new server.
老方法
但是,为了回答您之前的问题,最常见的 ClassNotFoundException 原因是:
名字错了class
CreateObject 需要一个 class 名称 (cAsE sEnSiTiVe)。
Jar 文件不在 CF class 路径中
除了核心 JVM 路径外,CF 仅扫描 Server Settings > ColdFusion Class Path
中列出的位置。放置在别处的 Jar 文件将不会被检测到。 (默认CFclass路径包括WEB-INF\lib
目录)
在 class 路径中放置库的多个副本有时会导致错误。尽管根据我的经验,该问题通常会导致不同的错误。
忘记重启 CF 服务器
除了核心 JVM 路径外,CF 服务器在启动时仅扫描 class 路径位置。因此,必须重新启动 CF 服务器才能检测到任何新的 jar。
您的错误是由#1 - 错误的 class 名称引起的。 org.apache.pdfbox.pdmodel
是 包的名称 - 不是 class。 class 名称应为 org.apache.pdfbox.pdmodel.PDDocument
(注意 PDDocument 的拼写)。
我已经下载了 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
中,有一个PDDocumentclass。我试过引用 org.apache.pdfbox.pdmodel.PDDocuemtn
但它仍然给我错误。我已将所有这些文件放在 {application.home}\jre\lib
和 {application.home}\wwwroot\WEB-INF\lib
下。错误还是一样。是不是我没有把jar文件放在正确的位置?有人知道我该如何解决这个问题吗?
CF2016的首选方法+
CF2016+ 有一个更简单的选项,而不是每次都要重新启动服务器 class 路径。使用 this.javaSettings 在 Application.cfc 中动态加载 jars。 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
]
};
}
Much easier to check the JARs in with your code base and deploy to servers instead of having to document for DevOps to remember to put JAR X in location Y should you need to upgrade or build a new server.
老方法
但是,为了回答您之前的问题,最常见的 ClassNotFoundException 原因是:
名字错了class
CreateObject 需要一个 class 名称 (cAsE sEnSiTiVe)。
Jar 文件不在 CF class 路径中
除了核心 JVM 路径外,CF 仅扫描
Server Settings > ColdFusion Class Path
中列出的位置。放置在别处的 Jar 文件将不会被检测到。 (默认CFclass路径包括WEB-INF\lib
目录)在 class 路径中放置库的多个副本有时会导致错误。尽管根据我的经验,该问题通常会导致不同的错误。
忘记重启 CF 服务器
除了核心 JVM 路径外,CF 服务器在启动时仅扫描 class 路径位置。因此,必须重新启动 CF 服务器才能检测到任何新的 jar。
您的错误是由#1 - 错误的 class 名称引起的。 org.apache.pdfbox.pdmodel
是 包的名称 - 不是 class。 class 名称应为 org.apache.pdfbox.pdmodel.PDDocument
(注意 PDDocument 的拼写)。