ColdFusion ~ Class 不能是接口(仅限 OSX)

ColdFusion ~ Class must not be an interface (OSX only)

我正在使用 Google API Java 客户端创建一个凭证对象。以下代码适用于 Windows,但会在 OSX 10.10.3 (Yosemite).

上引发错误
<cfscript>
    httpTransport = createObject("java", "com.google.api.client.http.javanet.NetHttpTransport").init();
    jsonFactory = createObject("java","com.google.api.client.json.jackson2.JacksonFactory").init();
    credential = createObject("java", "com.google.api.client.googleapis.auth.oauth2.GoogleCredential$Builder").init();
</cfscript>

我可以在某些 classes 上毫无问题地调用 createObject(NetHttpTransport、JacksonFactory 等),但是当我尝试实例化凭证生成器时,出现以下错误:

对象实例化异常。

实例化 Java 对象时发生异常。 class 不能是接口或抽象 class。错误:com/google/api/client/auth/oauth2/Credential$Builder.

java.lang.NoClassDefFoundError: com/google/api/client/auth/oauth2/Credential
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
...
    at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
    at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
    at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
Caused by: java.lang.ClassNotFoundException: com.google.api.client.auth.oauth2.Credential
    at java.net.URLClassLoader.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 60 more

我最终尝试在 ColdFusion 中重现的 java 代码是:

GoogleCredential credential = new GoogleCredential.Builder()
        .setTransport(httpTransport)
        .setJsonFactory(JSON_FACTORY)
        .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
        .setServiceAccountPrivateKeyFromP12File(new File(KEY_FILE_LOCATION))
        .setServiceAccountScopes(AnalyticsScopes.all())
        .build();

Here's the full Stack Trace

直接访问可能适用于某些 类 而不适用于其他人,因为它不适用的那些可能期望助手 类 在 classPath 中。将 Google API Java 文件的位置路径添加到 jvm.config 文件(例如 jrun4/bin/jvm.config)并重新启动 CF 服务器可能会修复问题。

# JVM classpath
java.class.path={application.home}/servers/lib,{application.home}/servers/lib,{application.home}/servers/cfusion/cfusion-ear/cfusion-war/WEB-INF/cfusion/lib/oosdk/classes,{application.home}/servers/cfusion/cfusion-ear/cfusion-war/WEB-INF/cfusion/lib/oosdk/lib,{application.home}/lib