2016-06-09 1 views
0

Я работаю над плагином для сервера OpenFire. Я пытаюсь интегрировать Spring в этот плагин. Когда инициализируется плагин, я хотел бы вызвать Основной метод для моей Spring.Вызов основного метода из другой ошибки класса

Когда я выполняю Spring только, он работает нормально, но когда я вызываю его основной метод из моего плагина, я получаю исключение. Как я могу назвать основной метод Spring. Что мне не хватает. Любая помощь будет оценена по достоинству. Спасибо.

Весна Главный класс:

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) { 
     try { 
      SpringApplication.run(Application.class, args); 
      System.out.println("No error"); 
     } catch (Exception e) { 
      System.out.println("Error " + e); 

     } 

    } 
}

OpenFire Plugin: Выходной

public class FetchNewsPlugin implements Plugin { 

    @Override 
    public void initializePlugin(PluginManager manager, File pluginDirectory) { 
     Runnable r = new Runnable() { 
      public void run() { 
       String[] args = {}; 
       Application.main(args); 
      } 
     }; 

     new Thread(r).start(); 
     System.out.println("Plugin Intitialized"); 

    } 

    @Override 
    public void destroyPlugin() { 
    } 

}

Вход:

Exception in thread "Thread-13" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication at hello.Application.main(Application.java:11) at org.clinton.openfire.plugin.FetchNewsPlugin$1.run(FetchNewsPlugin.java:20) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication at java.net.URLClassLoader.findClass(URLClassLoader.java:381) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 3 more

Где Исключение бросают:

 /** 
    * Finds and loads the class with the specified name from the URL search 
    * path. Any URLs referring to JAR files are loaded and opened as needed 
    * until the class is found. 
    * 
    * @param name the name of the class 
    * @return the resulting class 
    * @exception ClassNotFoundException if the class could not be found, 
    *   or if the loader is closed. 
    * @exception NullPointerException if {@code name} is {@code null}. 
    */ 
    protected Class findClass(final String name) 
     throws ClassNotFoundException 
    { 
     final Class result; 
     try { 
      result = AccessController.doPrivileged(
       new PrivilegedExceptionAction>() { 
        public Class run() throws ClassNotFoundException { 
         String path = name.replace('.', '/').concat(".class"); 
         Resource res = ucp.getResource(path, false); 
         if (res != null) { 
          try { 
           return defineClass(name, res); 
          } catch (IOException e) { 
           throw new ClassNotFoundException(name, e); 
          } 
         } else { 
          return null; 
         } 
        } 
       }, acc); 
     } catch (java.security.PrivilegedActionException pae) { 
      throw (ClassNotFoundException) pae.getException(); 
     } 
     if (result == null) { 
      throw new ClassNotFoundException(name); 
     } 
     return result; 
    }
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/home/clinton/git/Openfire/bin/build/lib/ant/slf4j-simple.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/home/clinton/git/Openfire/bin/build/lib/dist/slf4j-log4j12.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/home/clinton/git/Openfire/build/lib/ant/slf4j-simple.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/home/clinton/git/Openfire/build/lib/dist/slf4j-log4j12.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.SimpleLoggerFactory]

ответ

0

Похоже, вы используете URLClassLoader для загрузки классов, которые вам нужны. Однако, URLClassLoader должен содержать все предметы или банки, это зависит не только от самой банки.

Другими словами, вы должны извлечь свою банку и добавить все необходимые предметы в ваш URLClassLoader.

Таким образом, он должен работать. И, пожалуйста, дайте мне знать, если возникнут проблемы.

И вопрос https://stackoverflow.com/a/37339725/5619827 может быть полезным.

+0

Я не думаю, что я использую любой URLClassLoader. Я не затронул ничего такого имени o: o. Если вам нужен мой pom.xml, дайте мне знать, я добавлю его. Спасибо –

+0

Я видел метод из URLClassLoader, где генерируется исключение. Проверьте обновленный вопрос. –

+0

Когда я запускаю один и тот же проект, он работает, он перестает работать, когда он вызывается классом Plugin. :( –

0

Спасибо @Gemini за помощь, но я думаю, я был слишком глупым, чтобы следовать его пути. Я нашел другое обходное решение: поскольку Spring может начать успешно, когда выполняется один. Я в комплекте Весны в работоспособный файл фляги и выполняюсь с помощью следующего когда я плагина начинается:

private void startSpring() { 
    try { 
    ProcessBuilder processBuilder = new ProcessBuilder("/usr/lib/jvm/java-8-oracle/bin/java", "-jar", 
      "/home/clinton/git/Maven/target/mavenproject2-1.0-SNAPSHOT.jar"); 
    processBuilder.directory(new File("/home/clinton/git/Maven/Working")); 
    File log = new File("log"); 
    processBuilder.redirectErrorStream(true); 
    processBuilder.redirectOutput(Redirect.appendTo(log)); 
    Process p = processBuilder.start(); 
    assert processBuilder.redirectInput() == Redirect.PIPE; 
    assert processBuilder.redirectOutput().file() == log; 
    assert p.getInputStream().read() == -1; 
    System.out.println("Started success"); 

     //Process p = processBuilder.start(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

Я надеюсь, что это поможет кому-то тоже. Я всегда нахожу способ :)

+0

Значит, вы действительно не помещаете необходимые библиотеки в свою банку? Это можно легко найти, если вы проверили предметы загрузчика вашего класса. Но, во всяком случае, поздравления. –

+0

Изменено. В соответствии с примерами Oracle, найденными здесь, https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html –