【问题标题】:classloader path to get list of files in .war获取 .war 中文件列表的类加载器路径
【发布时间】:2012-02-15 19:02:12
【问题描述】:

我不太确定从战争中获取文件列表的类加载器路径应该是什么样的。 这是我的结构:

.ear
|_ meta-inf
   |_ application.xml
|_ web.war
|_ lib
   |_ app.jar

MyApp.java 在 app.jar 中,而 MyApp.java 想要列出 web.war 中的所有文件。我不确定这是否可能。如果是这样,路径应该是什么?如果不可能,为什么不呢?

谢谢 -A

【问题讨论】:

    标签: java war ear


    【解决方案1】:

    根据应用的部署方式,war 文件可能不存在。比如解压后可能会被删除。

    如果战争没有被删除,如果您知道ClassLoader 的一些详细信息,您也许能够在文件系统上获取MyApp.java 的位置。

    据此,您可以假设 web.war 文件将位于与此相关的某个位置。

    这可能会让你开始:

    package stackoverflow;
    
    import java.io.IOException;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.util.Enumeration;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class TestServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            try {
                Class clazz = getClass();
                ClassLoader cl = clazz.getClassLoader();
                System.out.println("ClassLoader=" + cl);
    
                // Where does the servlet itself live?
                String resourceNameForClass = clazz.getName().replaceAll("\\.", "/") + ".class";
                System.out.println("resourceNameForClass=" + resourceNameForClass);
                for (Enumeration<URL> e = cl.getResources(resourceNameForClass); e.hasMoreElements();) {
                    System.out.println("resource=" + e.nextElement());
                }
    
                // What about a class that lives in a jar in WEB-INF/lib
                clazz = Class.forName("org.slf4j.Logger");
                resourceNameForClass = clazz.getName().replaceAll("\\.", "/") + ".class";
                System.out.println("resourceNameForClass=" + resourceNameForClass);
                for (Enumeration<URL> e = cl.getResources(resourceNameForClass); e.hasMoreElements();) {
                    System.out.println("resource=" + e.nextElement());
                }
    
                if (cl instanceof URLClassLoader) {
                    URLClassLoader ucl = (URLClassLoader) cl;
                    URL[] urls = ucl.getURLs();
                    for (int i = 0; i < urls.length; i++) {
                        System.out.println("url[" + i + "]=" + urls[i]);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    

    生产:

    ClassLoader         =com.google.appengine.tools.development.IsolatedAppClassLoader@1909385
    resourceNameForClass=stackoverflow/TestServlet.class
    resource            =file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/classes/stackoverflow/TestServlet.class
    resourceNameForClass=org/slf4j/Logger.class
    resource            =jar:file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/slf4j-api-1.6.4.jar!/org/slf4j/Logger.class
    url[0]=file:/D:/apps/eclipse-jee-helios-win32/plugins/com.google.appengine.eclipse.sdkbundle_1.6.1.v201112160242r36/appengine-java-sdk-1.6.1/lib/impl/agent/appengine-agentruntime.jar
    url[1]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/classes/
    url[2]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/appengine-api-1.0-sdk-1.6.1.jar
    url[3]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/appengine-api-labs-1.6.1.jar
    url[4]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/appengine-jsr107cache-1.6.1.jar
    url[5]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/datanucleus-appengine-1.0.10.final.jar
    url[6]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/datanucleus-core-1.1.5.jar
    url[7]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/datanucleus-jpa-1.1.5.jar
    url[8]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/geronimo-jpa_3.0_spec-1.1.1.jar
    url[9]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/geronimo-jta_1.1_spec-1.1.1.jar
    url[10]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/google_sql.jar
    url[11]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/gson-2.1.jar
    url[12]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/jdo2-api-2.3-eb.jar
    url[13]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/jsr107cache-1.1.jar
    url[14]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/log4j-1.2.16.jar
    url[15]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/slf4j-api-1.6.4.jar
    url[16]=file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/slf4j-log4j12-1.6.4.jar
    url[17]=file:/D:/apps/eclipse-jee-helios-win32/plugins/com.google.appengine.eclipse.sdkbundle_1.6.1.v201112160242r36/appengine-java-sdk-1.6.1/lib/tools/jsp/repackaged-appengine-jakarta-jstl-1.1.2.jar
    url[18]=file:/D:/apps/eclipse-jee-helios-win32/plugins/com.google.appengine.eclipse.sdkbundle_1.6.1.v201112160242r36/appengine-java-sdk-1.6.1/lib/tools/jsp/repackaged-appengine-jakarta-standard-1.1.2.jar
    url[19]=file:/D:/apps/eclipse-jee-helios-win32/plugins/com.google.appengine.eclipse.sdkbundle_1.6.1.v201112160242r36/appengine-java-sdk-1.6.1/lib/tools/jsp/repackaged-appengine-jasper-jdt-6.0.29.jar
    

    在我的示例中,我知道的一个类存在于 WEB-INF/lib(在我的例子中为org.slf4j.Logger)的 jar 中,它提供以下资源 URL:

    resource=jar:file:/D:/dev/workspaces/3.6/all/grimbo9/war/WEB-INF/lib/slf4j-api-1.6.4.jar!/org/slf4j/Logger.class
    

    据此我可以算出战争的解包地点。

    你可以做类似的事情。当然,您的里程可能会因您的应用服务器而异。

    【讨论】:

      猜你喜欢
      • 2019-08-04
      • 2011-12-29
      • 2013-09-06
      • 2011-03-26
      • 1970-01-01
      • 2017-04-12
      • 2015-11-21
      • 1970-01-01
      • 2013-12-14
      相关资源
      最近更新 更多