JavaSession.getClass бросает ClassNotFoundException

  • Автор темы nvyush
  • Дата начала
N

nvyush

Здравия всем!
Ситуация: в лотусовой БД есть Java библиотека с классом ClassName в пакете packageName (в панели объектов это выглядит как "packageName/ClassName")
В функции LS библиотеки типичный код:
Visual Basic:
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).
 
T

turumbay

В агенте поведение верное. Согласно хелпу требуется FQN класса. Почему работает код на акции - загадка. Агент и action запускаются на одной и той же машине? Может таки где-то торчит этот же класс но в дефолтном пакете? Что если тупо переименовать класс в библиотеке?

Проверил на 7.0.3 и 8.5.1 Standard. FQN работает в агенте и акции. Если не указать пакет - падает также синхронно.
Java Library: "NvyProblem"
Java:
package ru.turumbay;
public class NvyProblem {
}
LS Library: "NvyProblemLS"
Visual Basic:
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"
Visual Basic:
Option Public
Option Declare
Use "NvyProblemLS"
Sub Initialize
    Call runProblemCode()
End Sub
form action "NvyAction"
Visual Basic:
Option Declare
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
7 985
611
BIT
473
Set jClass = jSession.GetClass("ru.turumbay.NvyProblem")
есть разница в нотациях через точку (как у нормальных людёв :) ) и через слэш (чиста LS заморочка), кот. считается кросс-платформенным
может в это дело?
 
N

nvyush

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
код в либе или в самой кнопке?
 
N

nvyush

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

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
библиотека цепляется на уровне формы или в хотспот?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
а в форме эта либа тоже есть?...
д.р. словами - нетли переопределения либ (что нежелательно)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
дык могет положить (как раз) туды
 
N

nvyush

Переместил Use библиотеки из подформы непосредственно в кнопку и всё заработало. Нет слов, одни буквы, да и те нецензурные :welcome:
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
Переместил Use библиотеки из подформы
не рекомендую так размещать либы... (в подформах)
либо в кнопке либо в форме, но тогда придётся отказываться от Option Declare (если код в подформе)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!