2012-03-30 13 views
1

私は興味深いセットアップを持っています。私はWebサービスを登録するWebアプリケーションを持っています。 Webサービスは、基本的に以下のないクラスのブーフのフロントエンドである:RMIサーバーが は、いくつかの仕事をするために、指定されたクラスとのJVMを使用してサブプロセスを開始war webアプリケーションからjvmサブプロセスを開始

    1. セットアップ

    通常、クラスパスを解決するために、私はSystem.getProperty( "java.class.path")を読みました。私はこれを-cpパラメータに設定しました。しかし、warファイルでは、これは役に立たない。どのように私はこの機能を動作させるが、WARファイルにすることができます

    public static Process launchClassProcess(@SuppressWarnings("rawtypes") Class c, String[] javaArgs, String[] programArgs) throws Exception { 
        String separator = System.getProperty("file.separator"); 
        String classpath = System.getProperty("java.class.path"); 
        String home = System.getProperty("java.home"); 
        String path = home + separator + "bin" + separator + "java"; 
        String[] jvmArgs = new String[] { path, "-cp", classpath }; 
        String[] classArgs = new String[] { c.getName() }; 
        String[] processBuilderArgs = new String[jvmArgs.length + javaArgs.length + classArgs.length + programArgs.length]; 
        int i = 0; 
    
        for (String arg:jvmArgs) { 
         processBuilderArgs[i++] = arg; 
        } 
    
        for (String arg:javaArgs) { 
         processBuilderArgs[i++] = arg; 
        } 
    
        for (String arg:classArgs) { 
         processBuilderArgs[i++] = arg; 
        } 
    
        for (String arg:programArgs) { 
         processBuilderArgs[i++] = arg; 
        } 
    
        ProcessBuilder processBuilder = new ProcessBuilder(processBuilderArgs); 
        StringBuilder command = new StringBuilder(); 
        int j = 0; 
    
        for (String part:processBuilder.command()) { 
         if (j++ != 0) { 
          command.append(" "); 
         } 
    
         command.append(part); 
        } 
    
        LogUtils.recordMessage("executing: " + command.toString()); 
    
        processBuilder.redirectErrorStream(true); 
    
        return (new ProcessBuilder(processBuilderArgs)).start(); 
    } 
    

    これはクラスパスから特定のクラスを起動し、私の機能がどのように見えるかですか?私はwarファイルがファイルシステム上で解凍された場所を何とか見つけて、完全なクラスパスを構築できるlibsフォルダを見つけなければならないと思います。

  • +0

    とその下にあるアプリの世話をする:

    私たちは、次のサーブレットを必要とする、のは、それを呼ぶことにしましょう。そして、私たちは魔法を行うにはweb.xmlにサーブレットを登録する必要があり

    public class InitServlet extends HttpServlet { public void init() throws ServletException { String libRealPath = getServletContext().getRealPath("/WEB-INF/lib/"); if (libRealPath == null) { throw new ServletException("cannot find web-inf lib path"); } ArrayList<String> libs = new ArrayList<String>(); File libDir = new File(libRealPath); for (String file:libDir.list(new FilenameFilter() { public boolean accept(File dir, String file) { return file.endsWith(".jar"); } })) { libs.add(libRealPath + System.getProperty("file.separator") + file); } System.setProperty("java.class.path", System.getProperty("java.class.path") + System.getProperty("path.separator") + ProcessUtils.joinPaths(libs)); } } 

    をInitServletサーバークラスローディングポリシーニース質問、これをいくつかのenlightmentを楽しみにして! – BigMike

    +0

    リソースを介してどのクラスにもファイルURLを見つけることができます。そこから、クラスのルートを先頭に戻って、jarがどこにあるのかを調べ、その下のすべてをクラスパスとして登録することができます。しかし、これは想像できるように少し不安です。 Webアプリケーション内で現在実行中であれば、何らかの形で検出することができれば、リスクを大幅に最小限に抑えることができます。 – Pass

    答えて

    0

    あなたはのServletContextからlibフォルダの内容を取得することができます:

    ServletContext context = ....; 
    Set<String> libs = context.getResourcePaths("/WEB-INF/lib"); 
    
    1

    これを行うための最善の方法は、上記の機能を動作させるために、クラスパスを変更する魔法のビットを追加することです。

    <servlet> 
        <servlet-name>init-servlet</servlet-name> 
        <servlet-class>InitServlet</servlet-class> 
        <load-on-startup>1</load-on-startup> 
    </servlet> 
    
    関連する問題