Javasession.getclass бросает Classnotfoundexception

nvyush

Lotus team
22.04.2009
2 317
0
#1
Здравия всем!
Ситуация: в лотусовой БД есть Java библиотека с классом ClassName в пакете packageName (в панели объектов это выглядит как "packageName/ClassName")
В функции LS библиотеки типичный код:
Код:
	Dim jSession As JavaSession
Set jSession = New JavaSession()
Dim jClass As JavaClass
Set jClass = jSession.GetClass("ClassName") 'бросает исключение в агенте
При вызове из кнопки формы срабатывает на ура, при вызове из агента на последней строке бросает исключение ClassNotFoundException.
Меняю имя класса на "packageName/ClassName" — всё наоборот, в агенте срабатывает, в кнопке бросает исключение.
Обработчиком ошибок заставил пробовать оба варианта, но хотелось бы разобраться, что не так.
Есть идеи?

Клиент 8.0.2 basic
Выгрузить библиотеку в jvm/lib/ext не предлагать (ну не любят боссы лишний раз переоткрывать Lotus)
 
13.03.2009
625
1
#2
В агенте поведение верное. Согласно хелпу требуется FQN класса. Почему работает код на акции - загадка. Агент и action запускаются на одной и той же машине? Может таки где-то торчит этот же класс но в дефолтном пакете? Что если тупо переименовать класс в библиотеке?

Проверил на 7.0.3 и 8.5.1 Standard. FQN работает в агенте и акции. Если не указать пакет - падает также синхронно.
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Java Lib, Ls Lib, agent, form action</div></div><div class="sp-body"><div class="sp-content">Java Library: "NvyProblem"
Код:
package ru.turumbay;
public class NvyProblem {
}
LS Library: "NvyProblemLS"
Код:
Option Public
Option Declare
Uselsx"*javacon"
Use "NvyProblem"
Function runProblemCode()
Dim jSession As New JavaSession()
Dim jClass As JavaClass
Set jClass = jSession.GetClass("ru.turumbay.NvyProblem") 
End Function
агент: "nvyAgent"
Код:
Option Public
Option Declare
Use "NvyProblemLS"
Sub Initialize
Call runProblemCode()
End Sub
Option Declare
form action "NvyAction"
Код:
Use "NvyProblemLS"
Sub Click(Source As Button)
Call runProblemCode()
End Sub
Есть возможность прогнать именно этот конкретный код?

Также хочется посмотреть, каким класслоадером нотус грузит объекты в обоих случаях:
Объект класса впоследствии создается или используются статик методы?
в конструктор System.out.println( this.getClass().getClassLoader().getClass().getName());
в статике: ИМЯ_КЛАССА.getClassLoader().getClass().getName()
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#3
Set jClass = jSession.GetClass("ru.turumbay.NvyProblem")
есть разница в нотациях через точку (как у нормальных людёв :) ) и через слэш (чиста LS заморочка), кот. считается кросс-платформенным
может в это дело?
 

nvyush

Lotus team
22.04.2009
2 317
0
#4
Небольшое уточнение. Это не акция, кнопка (Hotspot Button) и ведёт она себя так, когда документ открывается через
Call workspace.EditDocument(True, doc). Когда документ открывается двойным кликом из представления, поведение кнопки идентично поведению агента. Но самое интересное, после того как документ будет открыт из представления и потом закрыт, кнопка начинает вести себя прилично и при открытии документа через workspace.EditDocument, причём даже после переоткрытия базы. После перезапуска клиента Lotus всё возвращается на кругие своя. Индоглюк, одним словом :) .
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#5
код в либе или в самой кнопке?
 

nvyush

Lotus team
22.04.2009
2 317
0
#6
код в либе или в самой кнопке?
Код в кнопке вызывает функцию из LS-библиотеки, в которой вызов статического метода ява-класса из ява-библиотеки.
В тестовом агенте код
Код:
Sub Initialize
Call Click(Nothing)
End Sub
где Click — процедура, скопированная в агента из кнопки.

Поведение идентично как в 8.0.2 basic, так и в 8.5.1 basic.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#7
библиотека цепляется на уровне формы или в хотспот?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#9
а в форме эта либа тоже есть?...
д.р. словами - нетли переопределения либ (что нежелательно)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#11
дык могет положить (как раз) туды
 

nvyush

Lotus team
22.04.2009
2 317
0
#12
Переместил Use библиотеки из подформы непосредственно в кнопку и всё заработало. Нет слов, одни буквы, да и те нецензурные :welcome:
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 584
271
#13
Переместил Use библиотеки из подформы
не рекомендую так размещать либы... (в подформах)
либо в кнопке либо в форме, но тогда придётся отказываться от Option Declare (если код в подформе)