NoClassDefFoundError, если вызывается класс вне основного метода - PullRequest
0 голосов
/ 03 мая 2018

Я использую необязательный класс из библиотеки Guava в классе плагинов для IBM Rational Rhapsody.

Когда я запускаю класс как плагин изнутри Rhapsody, вызов класса Optional вызывает ошибку «java.lang.NoClassDefFoundError», хотя, когда я вызываю его в методе класса main и запускаю свой класс как приложение java, работает отлично. Вот код:

package com.example;

import com.google.common.base.Optional;
import com.telelogic.rhapsody.core.IRPApplication;
import com.telelogic.rhapsody.core.RPUserPlugin;
import com.telelogic.rhapsody.core.RhapsodyAppServer;

public class Test extends RPUserPlugin{

  public static void main(String[] args) {
    IRPApplication rhp = RhapsodyAppServer.getActiveRhapsodyApplication();
    Optional<IRPApplication> app = Optional.of(rhp);
    doSomething(app);
  }

  /** 
   * this is called by rhapsody
   */
  @Override
  public void RhpPluginInit(IRPApplication rpyApplication) {
    IRPApplication rhp = RhapsodyAppServer.getActiveRhapsodyApplication();
    Optional<IRPApplication> app = Optional.of(rhp);
    doSomething(app);
  }

}

1 Ответ

0 голосов
/ 03 мая 2018

Похоже, проблема пути к классам. Убедитесь, что вы либо вложили код Google в банку своего плагина, либо сделали запись пути к классам в своем .hep файле. Я использую Scala в качестве своего предпочтительного языка и использую параметры повсюду, но я обязательно включаю среду выполнения scala в файл jar плагина. Также убедитесь, что реализовали остальные методы в этом интерфейсе. Как плагин, действие REAL плагина не происходит до тех пор, пока Rhapsody не вызовет метод RhpPluginInvokeItem () при его запуске через меню «Инструменты» внутри Rhapsody. Смотрите мой пример ниже:

public class Test extends RPUserPlugin{
  IRPApplication rhp=null;

  public static void main(String[] args) {
     // no optionals in my example...
     Test plugin = new Test();
     IRPApplication app = RhapsodyAppServer.getActiveRhapsodyApplication();
     if (app != null) {
       plugin.RhpPluginInit(app);
       plugin.RhpPluginInvokeItem();
     }  else System.out.println("No running Rhapsody application found.");
   }

  @Override
  public void RhpPluginInit(IRPApplication rpyApplication) {
    // Don't re-acquire the handle to the active application here, that gets
    // handed to you in the parameter above (rpyApplication)
    //IRPApplication rhp = RhapsodyAppServer.getActiveRhapsodyApplication();
    rhp = rpyApplication;
    // setup logic here...in preparation for RhpPluginInvokeItem() to be called.
  }

  @Override
  public void RhpPluginInvokeItem() {
    rhp.writeToOutputWindow("plugin","Invoking doSomething()...");
    //doSomething();
  }

  // implement the rest of the overriden methods here...
}
...