根据应用的部署方式,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
据此我可以算出战争的解包地点。
你可以做类似的事情。当然,您的里程可能会因您的应用服务器而异。