java - ColdFusion ~ 类不能是接口(interface)(仅限 OSX)

标签 java macos coldfusion

我正在使用 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 对象时发生异常。该类不能是接口(interface)或抽象类。错误: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 服务器可能会解决问题。

# 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

关于java - ColdFusion ~ 类不能是接口(interface)(仅限 OSX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30582612/

相关文章:

java - 如何从 IntStream 填充 List<Integer>?

java - 如何在 SQLite android 中保存和检索路径图像

c++ - 如何使用 Cocoa 或 C++ 在 Mac OS X 中截屏

python - tkinter mac,最小化屏幕

macos - 如何在 Mac OS X 上以编程方式挂起/恢复进程及其子进程?

coldfusion - 文件是否存在且不可读?

jquery - 如何将 URL 重写为小写而不在服务器上进行两次点击?

java - 解析具有可变键值对的字符串

java - Web 应用程序的并发数据库访问模式

unit-testing - 是否可以在 ColdFusion 中找到代码覆盖率?