путь к загрузчику классов для получения списка файлов в формате .war - PullRequest
0 голосов
/ 15 февраля 2012

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

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

MyApp.java находится в app.jar, а MyApp.java хочет перечислить все файлы в web.war. Я не уверен, если это возможно. Если да, какой путь должен быть? Если это невозможно, почему бы и нет?

Спасибо -

1 Ответ

0 голосов
/ 16 февраля 2012

В зависимости от того, как приложение развернуто, файл war может не существовать.Например, он может быть удален после распаковки.

Если война не удалена, вы можете получить местоположение MyApp.java в файловой системе, если знаете некоторые деталио его ClassLoader.

Исходя из этого, вы можете предположить, что файл 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 в моем случае), дает следующий ресурс 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

Из этого я могу понять, где распакована война.

Вы можете сделать подобное.Конечно, ваш пробег может варьироваться в зависимости от вашего сервера приложений.

...