Javasession.getclass бросает Classnotfoundexception

Тема в разделе "Lotus + Java + LS2J", создана пользователем nvyush, 16 мар 2011.

  1. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Здравия всем!
    Ситуация: в лотусовой БД есть Java библиотека с классом ClassName в пакете packageName (в панели объектов это выглядит как "packageName/ClassName")
    В функции LS библиотеки типичный код:
    Код (LotusScript):
        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)
     
  2. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    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"
    Код (Text):
    package ru.turumbay;
    public class NvyProblem {
    }
    LS Library: "NvyProblemLS"
    Код (Text):
    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"
    Код (Text):
    Option Public
    Option Declare
    Use "NvyProblemLS"
    Sub Initialize
    Call runProblemCode()
    End Sub
    Option Declare
    form action "NvyAction"
    Код (Text):
    Use "NvyProblemLS"
    Sub Click(Source As Button)
    Call runProblemCode()
    End Sub
    Есть возможность прогнать именно этот конкретный код?

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    есть разница в нотациях через точку (как у нормальных людёв :) ) и через слэш (чиста LS заморочка), кот. считается кросс-платформенным
    может в это дело?
     
  4. nvyush

    nvyush Lotus team
    Lotus team

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    код в либе или в самой кнопке?
     
  6. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Код в кнопке вызывает функцию из LS-библиотеки, в которой вызов статического метода ява-класса из ява-библиотеки.
    В тестовом агенте код
    Код (LotusScript):
    Sub Initialize
    Call Click(Nothing)
    End Sub
    где Click — процедура, скопированная в агента из кнопки.

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

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    библиотека цепляется на уровне формы или в хотспот?
     
  8. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    На уровне подформы
     
  9. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    а в форме эта либа тоже есть?...
    д.р. словами - нетли переопределения либ (что нежелательно)
     
  10. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    В форме этой либы нет
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    дык могет положить (как раз) туды
     
  12. nvyush

    nvyush Lotus team
    Lotus team

    Регистрация:
    22 апр 2009
    Сообщения:
    2.317
    Симпатии:
    0
    Переместил Use библиотеки из подформы непосредственно в кнопку и всё заработало. Нет слов, одни буквы, да и те нецензурные :welcome:
     
  13. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    не рекомендую так размещать либы... (в подформах)
    либо в кнопке либо в форме, но тогда придётся отказываться от Option Declare (если код в подформе)
     

Поделиться этой страницей