我正在使用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>


我可以在某些类上没有问题(NetHttpTransport,JacksonFactory等)调用createObject,但是当我尝试实例化凭据生成器时,出现以下错误:

对象实例化异常。

实例化Java对象时发生异常。该类不得为接口或抽象类。错误: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$1.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 Server可能会解决此问题。

# 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

09-04 13:54
查看更多