【问题标题】:ClassPathXmlApplicationContext from a Runtime.getRuntime.exec来自 Runtime.getRuntime.exec 的 ClassPathXmlApplicationContext
【发布时间】:2014-04-22 12:12:38
【问题描述】:

我在 Eclipse 中使用 spring 开发了一个 web 应用程序来处理依赖注入和部署 maven。 我正在尝试使用这个小代码:

public class MainExternal {


public static void main( String[] args ) throws Exception{


        @SuppressWarnings("resource")           ApplicationContext appContext = new ClassPathXmlApplicationContext( "classpath*:webConfiguration/applicationContext.xml");          ProjectBo projectBo                  = (ProjectBo) appContext.getBean("projectBo");

        System.out.println("-> Im 'in ");

        /************* PRINT OUT  *************/

        Project project = projectBo.findByNameOfStudy("Profiler");


        List<User> listUser = (List<User>) projectBo.findUsers(project);

        for (User myUser : listUser) {

                        System.out.println("User :"+myUser.getFirstname());

        }   
}

当我在 Eclipse 中运行它时,它可以工作。

但是当我从我的网络应用程序中调用它时,它不起作用:

public void throwAnalyse(){

    System.out.println("->I call my function");

    try {

    String[] command= {"java","-cp", "/Users/JP/git/CleanOmicsTracer/target/CleanOmicsTracer.jar", "com.clb.genomic.lyon.external.MainExternal"};

    Process p = Runtime.getRuntime().exec(command);

    ////////////////////////////////////////////
    //test for remote command
    String line;
    BufferedReader bri = new BufferedReader(new InputStreamReader(p.getInputStream()));
    BufferedReader bre = new BufferedReader(new InputStreamReader(p.getErrorStream()));

            while ((line = bri.readLine()) != null) {
                System.out.println(line);
            }
            bri.close();

            while ((line = bre.readLine()) != null) {
                System.out.println(line);
            }
            bre.close();

     p.waitFor();

    } catch (IOException e) {  e.printStackTrace();

    } catch (InterruptedException e) {  e.printStackTrace(); }


    System.out.println("End of programme");
}

当我尝试从控制台执行时:

java -cp /Users/JP/git/CleanOmicsTracer/target/CleanOmicsTracer.jar com.clb.genomic.lyon.external.MainExternal

它不再起作用并抛出:

线程“main”中的异常 java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext 引起:java.lang.ClassNotFoundException:org.springframework.context.ApplicationContext 在 java.net.URLClassLoader$1.run(URLClassLoader.java:202) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:190) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:306) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:247)

【问题讨论】:

    标签: java spring classpath applicationcontext


    【解决方案1】:

    将 Spring jar 文件添加到您的类路径。对于你可以做的主 jar 文件

    java -cp /path/to/CleanOmicsTracer.jar:spring-full-1.0.1.jar com.clb.genomic.lyon.external.MainExternal
    

    如果您有多个 JAR 文件,则可以使用类路径通配符

    java -cp /path/to/CleanOmicsTracer.jar:lib/* com.clb.genomic.lyon.external.MainExternal
    

    【讨论】:

    • 好的,我明白你的意思了。但是正确的使用路径是什么?我使用 Maven 来管理我的依赖项。在 Eclipse 中,当我进行全新安装时,jar 将进入 WEB-INF/lib 内的目标目录。看起来很奇怪,而且路径会在部署时改变,不是吗?
    • 由于您使用的是 Maven,我会让它管理查找相关的 jar 文件。见this
    猜你喜欢
    • 2011-11-12
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多