2015-06-01 1 views
2

Я создаю объект учетных данных с помощью Google API Java Client. Следующий код работает в Windows, но вызывает ошибку в OSX 10.10.3 (Yosemite).ColdFusion ~ Class не должен быть интерфейсом (только для OSX)

<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> 

Я могу назвать CREATEOBJECT на некоторых из классов без каких-либо проблем (NetHttpTransport, JacksonFactory и т.д.), но когда я пытаюсь создать экземпляр удостоверения Builder, я получаю следующее сообщение об ошибке:

Исключение экземпляра объекта.

Исключение произошло при создании объекта 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 

Java-код, который я в конечном счете пытается воспроизвести в ColdFusion является:

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

+1

Это сообщение об ошибке плиты котла для объектов java. Можете ли вы опубликовать полную трассировку стека? – Leigh

+0

Спасибо. След говорит, что один из необходимых классов отсутствует или недоступен: 'Caused by: java.lang.ClassNotFoundException: com.google.api.client.auth.oauth2.Credential'. Убедитесь, что вы добавили банку, содержащую этот класс, в путь класса CF - или для CF10 + [путь библиотеки приложений] (http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe61e35da8d318518-106e125d1353e804331-7ffd.html). – Leigh

ответ

2

Прямой доступ может работать для некоторых классов, а не для других, потому что те, для которых он не работает, могут ожидать, что вспомогательные классы будут в classPath. Добавление пути к местоположению ваших файлов Java API Google в файл 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 
+0

Да, это то, что указывает ClassNotFoundException. Один или несколько классов отсутствуют в пути класса CF и/или недоступны. В этом случае 'com.google.api.client.auth.oauth2.Credential'. Для будущих читателей те же заметки о jvm.config относятся к CF10 + (который использует TomCat вместо JRUN), но путь к файлу отличается. – Leigh

+1

Обратите внимание, что с CF10 + вы можете [загружать банки динамически] (http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSe61e35da8d318518-106e125d1353e804331-7ffd.html) через Application.cfc. Если вы используете этот подход, вам нужно добавить отсутствующие пути jar к 'THIS.javaSettings' вместо файла jvm.config. – Leigh

Смежные вопросы