【问题标题】:Calling Spring Main Method from Another Class Error从另一个类错误中调用 Spring Main 方法
【发布时间】:2016-10-10 18:42:49
【问题描述】:

我正在为 OpenFire 服务器开发插件。我正在尝试将 Spring 集成到这个插件中。插件初始化后,我想为我的 Spring 调用 Main 方法。

当我单独执行 Spring 时,它工作正常,但是当我从插件调用它的 main 方法时,我得到一个异常。 我想如何调用 Spring Main 方法。 我错过了什么。任何帮助将不胜感激。谢谢。

Spring 主类:

@SpringBootApplication
公共类应用程序{

    公共静态无效主要(字符串[]参数){
        尝试 {
            SpringApplication.run(Application.class, args);
            System.out.println("没有错误");
        } 捕捉(异常 e){
            System.out.println("错误" + e);

        }

    }
}

OpenFire 插件:

公共类 FetchNewsPlugin 实现插件 {

    @覆盖
    public void initializePlugin(PluginManager manager, File pluginDirectory) {
        可运行 r = new Runnable() {
             公共无效运行(){
                 字符串 [] 参数 = {};
                应用程序.main(args);
             }
         };

         新线程(r).start();
         System.out.println("插件初始化");

    }

    @覆盖
    公共无效destroyPlugin(){
    }

}

日志输出:

线程“Thread-13”中的异常 java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication 在 hello.Application.main(Application.java:11) 在 org.clinton.openfire.plugin.FetchNewsPlugin$1.run(FetchNewsPlugin.java:20) 在 java.lang.Thread.run(Thread.java:745) 引起:java.lang.ClassNotFoundException:org.springframework.boot.SpringApplication 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 3 更多

抛出异常的地方:

 /**
     * 从 URL 搜索中查找并加载具有指定名称的类
     * 小路。任何引用 JAR 文件的 URL 都会根据需要加载和打开
     * 直到找到类。
     *
     * @param name 类名
     * @return 生成的类
     * @exception ClassNotFoundException 如果找不到类,
     * 或者如果装载机已关闭。
     * @exception NullPointerException 如果 {@code name} 是 {@code null}。
     */
    受保护的类 findClass(最终字符串名称)
        抛出 ClassNotFoundException
    {
        最终班级成绩;
        尝试 {
            结果 = AccessController.doPrivileged(
                新的 PrivilegedExceptionAction>() {
                    公共类 run() 抛出 ClassNotFoundException {
                        String path = name.replace('.', '/').concat(".class");
                        资源 res = ucp.getResource(path, false);
                        如果 (res != null) {
                            尝试 {
                                返回定义类(名称,资源);
                            } 捕捉(IOException e){
                                throw new ClassNotFoundException(name, e);
                            }
                        } 别的 {
                            返回空值;
                        }
                    }
                }, ACC);
        } 捕捉(java.security.PrivilegedActionException pae){
            throw (ClassNotFoundException) pae.getException();
        }
        如果(结果==空){
            抛出新的 ClassNotFoundException(name);
        }
        返回结果;
    }
SLF4J:类路径包含多个 SLF4J 绑定。 SLF4J:在 [jar:file:/home/clinton/git/Openfire/bin/build/lib/ant/slf4j-simple.jar!/org/slf4j/impl/StaticLoggerBinder.class] 中找到绑定 SLF4J:在 [jar:file:/home/clinton/git/Openfire/bin/build/lib/dist/slf4j-log4j12.jar!/org/slf4j/impl/StaticLoggerBinder.class] 中找到绑定 SLF4J:在 [jar:file:/home/clinton/git/Openfire/build/lib/ant/slf4j-simple.jar!/org/slf4j/impl/StaticLoggerBinder.class] 中找到绑定 SLF4J:在 [jar:file:/home/clinton/git/Openfire/build/lib/dist/slf4j-log4j12.jar!/org/slf4j/impl/StaticLoggerBinder.class] 中找到绑定 SLF4J:有关说明,请参见 http://www.slf4j.org/codes.html#multiple_bindings。 SLF4J:实际绑定的类型为 [org.slf4j.impl.SimpleLoggerFactory]

【问题讨论】:

    标签: spring plugins openfire


    【解决方案1】:

    您似乎正在使用URLClassLoader 来加载您需要的类。但是,URLClassLoader 应该包含所有项目或罐子,它不仅取决于罐子本身。

    换句话说,您最好提取您的 jar 并将所有必要的项目添加到您的 URLClassLoader

    以这种方式它应该可以工作。如果有任何问题,请告诉我。

    问题https://stackoverflow.com/a/37339725/5619827 可能会有所帮助。

    【讨论】:

    • 我不认为,我正在使用任何 URLClassLoader。我没有碰过那个名字o:o的东西。如果您需要我的 pom.xml,请告诉我我会添加它。谢谢
    • 我已经从引发异常的 URLClassLoader 中看到了该方法。请检查更新后的问题。
    • 当我单独运行同一个项目时,它工作,当它被插件类调用时它停止工作。 :(
    • 你能告诉我你的 URLClassLoader 代码吗?我的意思是如何使用它。
    • 是的,所以我给你我的答案。
    【解决方案2】:

    感谢@Gemini 的帮助,但我想我太笨了,无法按照他的方式行事。我找到了另一种解决方法:因为 Spring 单独执行时可以成功启动。我将 Spring 捆绑到一个可运行的 jar 文件中,并在插件启动时使用以下内容执行:

    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();
        }
    }
    

    我希望这对某人也有帮助。我总能找到方法:)

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2017-09-27
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多