`

ear包中无法通过getRealPath()获得文件的真实路径【转】

 
阅读更多
一、war包中的文件的读取

在开发J2EE Web应用时,在开发阶段通常采用目录的部署方式,而在正式运行时通常把web应用打包为单个的.war文件进行方便地部署。也就是在你的应用目录(比如WebLogic的DefaultWebApp)下,执行下面的命令:

    jar cf0 mywebapp.war **

这样,要部署到正式系统时就非常方便,只需要把这个.war文件拷贝到WebLogic的applications目录或Tomcat的webapps目录下即可自动进行部署。Tomcat会对部署的.war应用包进行自动监控、解包,所以不会出现下面提到的问题。而WebLogic并不会自动解包.war,所以如果在你的应用中,需要读取原来应用中的配置文件或其它资源文件时,就会发现,在解包部署时,正常运行的程序,在WebLogic中打包部署时,运行却出错,会报告找不到该文件。例如下面的应用:

       |--DefaultWebApp            |--index.jsp            |--.....jsp            |--WEB-INF                 |-- web.xml                 |-- log4j.properties                   |-- classes                   ......

其中使用到了Log4J作为日志输出工具,Log4J的配置文件log4j.propertes放在DefaultWebApp\WEB-INF目录下。Log4J通过一个自动加载的Servlet进行初始化,初始化代码如下:

    ServletContext context = getServletContext();
    org.apache.log4j.PropertyConfigurator.configure(context.getRealPath("/") + 
"/WEB-INF/log4j.properties");

    其中,context.getRealPath("/")得到当前Web应用的真实根目录,比如,如果你的WebLogic安装在D:\bea下,在Windows下context.getRealPath("/")通常会返回:
    D:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp
在UNIX下类似:
    /bea/wlserver6.1/config/mydomain/applications/DefaultWebApp
这样,和"/ WEB-INF /log4j.properties"拼接后,就得到了log4j.properties文件的真实路径,Log4J通过文件IO读取这个配置文件,完成初始化。
    现在一切正常!测试通过后,将DefaultWebApp下的所有文件打为一个.war包,进行部署时,发现系统报告找不到“D:\bea\wlserver6.1\null\ WEB-INF \log4j.properties”文件!如果你的应用中还需要读取其它已经被打包到war包中的文件,都会报告找不到文件。并且,系统并不会到D:\bea\wlserver6.1\config\mydomain\applications\DefaultWebApp目录下寻找,而会到D:\bea\wlserver6.1\null下寻找。这是因为context.getRealPath("/")返回了null。查看ServletContext的API文档,

public String getRealPath(String path)
……
The real path returned will be in a form appropriate to the computer and operating system on which the servlet container is running, including the proper path separators. This method returns null if the servlet container cannot translate the virtual path to a real path for any reason (such as when the content is being made available from a .war archive).

原来,对一个打包的应用来说,是没有RealPath的概念的,调用getRealPath只会简单地返回null。其实,也很好理解,一个文件被打包入了.war文件,就不存在目录结构了(虽然包中仍然存在目录结构,但这不等同于文件系统中的目录结构)。所以,对war包中的资源是无法得到RealPath的。这样也就无从通过文件IO进行读取了。那么,如何读取war包中的资源呢?答案是使用ServletContext.getResourceAsStream(String)方法。
    对于org.apache.log4j.PropertyConfigurator,有如下几种配置方法:

  static void configure(Properties properties); 
  static void configure(String configFilename); 
  static void configure(URL configURL);

既然,现在不能得到war包中的Log4J的配置文件,那么可以通过读入InputStream,构造一个Properties,通过configure(Properties properties)方法同样可以完成配置。示例代码如下:

        InputStream is = getServletContext().
          getResourceAsStream("/WEB-INF/log4j.properties");
        Properties props = new Properties();
        try {
            props.load(is);
        } catch (IOException e) {
            System.err.println("Load log4j configuration failed");
        }
        PropertyConfigurator.configure(props);

那么,现在对于war应用可以成功运行,但如果现在不通过war部署,直接通过目录结构部署应用会不会又出现找不到资源的错误呢?请来看看ServletContext.getResourceAsStream的API文档,

Returns a URL to the resource that is mapped to a specified path. The path must begin with a "/" and is interpreted as relative to the current context root.
This method allows the servlet container to make a resource available to servlets from any source. Resources can be located on a local or remote file system, in a database, or in a .war file.

可见,通过getResourceAsStream可以获取包括本地文件系统、远程文件系统、war包等资源。不会出现上面担心的问题。

结论:在开发J2EE Web应用时,如果需要读取本应用中的文件,尽量使用ServletContext.getResourceAsStream进行,而不要使用文件IO。


二、Ant使用中的OutOfMemoryError解决

在开发大型项目时,类文件通常有数千个之多,这时都需要采用一些make工具来辅助开发。有时需要编译的类太多,使用Ant编译时,会出现OutOfMemoryError的错误,使编译进程中断。这时,通常通过先移出部分文件,分批编译。但Java编译过程的自动依赖编译,通常很难确定究竟应该先移出哪些文件、后移出哪些文件伤透脑筋。有没有简便的方法?有!
转到你的Ant的安装目录,在bin子目录中找到ant.bat,使用文字编辑器打开,修改:runAnt处的允许命令,添加如下参数:

:runAnt
"%_JAVACMD%" -Xms128m -Xmx512m -classpath ……

如果你安装了Jike,使用Jike编译器,则需要修改:runAntWithJikes处的运行命令,同上。

结论:Java虚拟机默认分配64M内存,如果你的应用比较大,超出64M内存,Java虚拟机就会抛出OutOfMemoryError,并停止运行。不管是什么应用(Web应用、Application等),只需要修改你的机器上的运行Java命令,在java xxx命令中添加-Xms(最小使用内存)、-Xmx(最大使用内存)即可解决。当然,这儿的内存容量都是指物理内存,不能超出你的机器的物理内存的总容量。


分享到:
评论

相关推荐

    得到文件真实路径

    在IT领域,尤其是在Java开发中,获取文件的真实路径是一个常见的需求。这主要涉及到对URL、绝对路径和相对路径的理解以及在JSP和Servlet环境中的应用。以下是对这些知识点的详细说明: 1. **绝对路径与相对路径** ...

    JavaWeb_servlet(11)_ 通过 ServletContex 获得类路径下的文件路径

    本篇文章将详细探讨如何通过ServletContext来获取类路径(ClassPath)下的文件路径。 首先,我们需要了解ServletContext的概念。ServletContext是一个全局的上下文对象,它在整个Web应用程序中是唯一的,可以看作是...

    GetRealPath.java

    用于添加其他应用列表打开文件获取微信QQ 分享过来的文件真实路径,并替换路径中存在的编码格式问题,解决文件上传媒体库找不到传输的文件,可以在微信,QQ中直接选择自己的应用打开,并获取到文件的路径!

    JAVA中如何得到文件路径.pdf

    5. **获取文件真实路径**: - 使用`request.getRealPath("mypath/filename")`。通常使用`request.getRealPath("/")`。 #### 四、文件操作类 为了简化文件操作,可以创建一个工具类,封装一些常用的方法。例如: `...

    在JAVA文件中获取该项目的相对路径.doc

    JAVA 文件中获取项目的相对路径 在 JAVA 文件中获取项目的相对路径是非常重要的,特别是在 ...通过了解绝对路径和相对路径的概念,我们可以更好地获取当前应用的相对路径和绝对路径,从而更好地处理文件和目录的操作。

    Java文件路径详解

    Java 文件路径详解 Java 文件路径详解是一种在 Java 中获取文件路径的方式。它可以将文件路径转换为 InputStream,以便于读取文件的内容。在 Java 中,有两种方式可以获取文件路径,即使用 Class....

    Request中getContextPath、getServletPath、getRequestURI、request.getRealPath的区别.doc

    - **真实路径**(`getRealPath`):指向服务器文件系统的实际物理路径。这对于访问服务器上的文件非常重要。 #### 四、实际应用案例 假设有一个Web应用程序,名为`myApp`,部署在服务器上,其根目录下有一个配置文件...

    log4j中配置日志文件相对路径方法(PDF)

    除了使用`log4j.properties`文件外,还可以通过XML文件来配置日志文件的路径。与`properties`文件类似,XML文件也支持变量的使用。 ##### 示例配置 ```xml ${WORKDIR}/logs/app.log"/> ``` 同样地,可以...

    ServletContext读取web应用中的资源文件.doc

    在 Servlet 中,我们可以使用 ServletContext 的 getRealPath(String path) 方法来获取资源文件的真实路径。该方法返回的是资源文件在服务器文件系统上的真实路径。参数 path 代表资源文件的虚拟路径,它应该以正...

    JavaWeb_servlet(10)_ 通过 ServletContex 获得根目录下的文件路径

    在这个主题中,我们将深入探讨如何使用ServletContext来获取JavaWeb应用的根目录下的文件路径,这对于读取、写入或操作静态资源如图片、CSS、JavaScript文件等非常有用。 首先,了解ServletContext接口。它在javax....

    JAVA获取各种路径总结

    - 如果你需要获取某个文件所在目录的上级目录,可以先通过`application.getRealPath(request.getRequestURI())`得到该文件的绝对路径,再使用`new File(...).getParent()`获取其上级目录。 2. **Servlet中获取路径...

    Java相对路径绝对路径总结

    **绝对路径**:绝对路径是指文件或目录在硬盘上的真实路径,包括URL和物理路径。例如,“C:\xyz\test.txt”代表了test.txt文件的真实物理路径;而“http://www.sun.com/index.htm”则代表了一个URL绝对路径。 **...

    java绝对路径和相对路径

    - 使用`ServletContext`对象的`getRealPath("/")`方法,同样可以获得Web应用的根目录的绝对路径。 - 示例:`E:\eclipseM9\workspace\tree\treeweb` #### 二、获取本地路径 在Java程序中,获取本地路径主要是指...

    服务器上文件判断

    在Java Web开发中,可以通过`getRealPath()`方法来获取服务器上实际的物理路径。例如: ```java String dir = request.getSession().getServletContext().getRealPath("/upLoadTest/upload"); ``` 这里,`request`...

    JAVA文件路径详细讲解[文].pdf

    在Java编程语言中,文件路径的管理是软件开发中不可或缺的一部分,尤其是在开发Web应用程序时,如JSP和Servlet。本文将深入探讨Java中文件路径的基本概念、相对路径和绝对路径的差异,以及在JSP/Servlet环境中的具体...

    java路径获得几种方法.txt

    - **定义**:获取Web应用程序中文件的真实物理路径。 - **3.1 JSP中的物理路径获取** - **示例**:获取当前Web应用的根目录,使用`application.getRealPath("/")`。 - 获取特定文件的物理路径,可以使用`new File...

    在JSP中处理虚拟路径

    摘要在为服务器端组件编程时,你很可能要从相对于web根的路径来取得某个文件的真实路径,但此文件实际上在站点的一个虚拟路径上。什么是虚拟路径?在一个web服务器上,虚拟路径将物理上分离的各文件组合在一起,放在...

Global site tag (gtag.js) - Google Analytics