`
huzhiyong56
  • 浏览: 27654 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于war包中的文件的读取

    博客分类:
  • Java
 
阅读更多

开发J2EE Web应用时,在开发阶段通常采用目录的部署方式,而在正式运行时通常把web应用打包为单个的.war文件进行方便地部署。也就是在你的应用目录(比如WebLogic的DefaultWebApp)下,执行下面的命令:
jar cf0 mywebapp.war **
这样,要部署到正式系统时就非常方便,只需要把这个.war文件拷贝到WebLogic的applications目录或Tomcat的webapps目录下即可自动进行部署。Tomcat会对部署的.war应用包进行自动监控、解包,所以不会出现下面提到的问题。而WebLogic并不会自动解包.war,所以如果在你的应用中,需要读取原来应用中的配置文件或其它资源文件时,就会发现,在解包部署时,正常运行的程序,在WebLogic中打包部署时,运行却出错,会报告找不到该文件。例如下面的应用:
[pre] |--DefaultWebApp
|--index.jsp
|--.....jsp
|--WEB-INF
|-- web.xml
|-- log4j.properties
|-- classes
......[/pre]
其中使用到了Log4J作为日志输出工具,Log4J的配置文件log4j.propertes放在DefaultWebAppWEB-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:beawlserver6.1configmydomainapplicationsDefaultWebApp
在UNIX下类似:
/bea/wlserver6.1/config/mydomain/applications/DefaultWebApp
这样,和"/ WEB-INF /log4j.properties"拼接后,就得到了log4j.properties文件的真实路径,Log4J通过文件IO读取这个配置文件,完成初始化。
现在一切正常!测试通过后,将DefaultWebApp下的所有文件打为一个.war包,进行部署时,发现系统报告找不到“D:beawlserver6.1null WEB-INF log4j.properties”文件!如果你的应用中还需要读取其它已经被打包到war包中的文件,都会报告找不到文件。并且,系统并不会到D:beawlserver6.1configmydomainapplicationsDefaultWebApp目录下寻找,而会到D:beawlserver6.1null下寻找。这是因为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,有如下几种配置方法:
staticvoid configure(Properties properties);
staticvoid configure(String configFilename);
staticvoid configure(URL configURL);
既然,现在不能得到war包中的Log4J的配置文件,那么可以通过读入InputStream,构造一个Properties,通过configure(Properties properties)方法同样可以完成配置。示例代码如下:
InputStream is = getServletContext().
getResourceAsStream("/WEB-INF/log4j.properties");
Properties props = newProperties();
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。

分享到:
评论

相关推荐

    读取war包或jar包内的文件

    在WAR包中,通常静态资源位于`WEB-INF/classes`或`WEB-INF/lib`下的JAR文件内;在JAR包中,资源通常与对应的类同级或者在特定的目录下。 4. **相对路径与绝对路径**: 在指定资源路径时,可以使用相对路径(相对于...

    SpringBoot如何读取war包jar包和Resource资源

    SpringBoot读取war包jar包和Resource...读取 war 包中的资源文件需要使用特殊的方法,使用 ClassLoader 的 getResourceAsStream() 方法可以读取 war 包中的资源文件。在读取资源文件时,需要注意路径的写法和使用场景。

    J2EE项目开发经验谈

    本文介绍了在J2EE项目开发中遇到的war包中的文件的读取问题,Ant使用中的OutOfMemoryError解决方法。

    tomcat类包中的一个

    标题中的“tomcat类包中的一个”表明我们讨论的主题与Tomcat有关,这是一款广泛使用的开源Java Servlet容器,用于部署和运行Web应用程序。Tomcat是Apache软件基金会的Jakarta项目的一部分,它实现了Java Servlet和...

    Java版钉钉群定时发消息(读取本地txt)

    本地TXT文件读取可以使用Java的`java.io`包中的`BufferedReader`类。打开文件,逐行读取,将内容整合成适合发送的格式。为了确保程序的健壮性,我们需要处理可能的文件读取异常,比如文件不存在、权限问题等。 在...

    jsp文件上传及下载

    - **读取文件**:从服务器的文件系统中读取要下载的文件内容,可以使用`java.io`包中的`FileInputStream`类。 - **流式传输**:将文件内容通过`ServletOutputStream`写入HTTP响应的输出流,以向客户端发送。 在...

    maven的打包、jetty配置、jetty事务检查、打包除resource之外的资源文件

    举例来说,如果你有一个图片目录需包含在最终的WAR包中,可以在pom.xml中添加如下配置: ```xml <directory>src/main/resources <directory>src/main/images **/* ``` 这样,src/main/images...

    外部Jar包加载到可执行Jar或War包相关代码

    在Java开发中,有时我们需要在运行时...通过以上知识点,我们可以理解如何编写和使用代码来加载外部Jar包到可执行的Jar或War包中。这在分布式系统、插件框架或持续集成环境中非常常见,增加了程序的灵活性和可扩展性。

    压缩文件(.rar/.zip)解压

    根据提供的文件信息,本文将详细解析关于如何使用Java语言来解压`.rar`或`.zip`格式的压缩文件。此过程涉及多个步骤和技术要点,包括但不限于处理文件输入输出流、利用`java.util.zip`包中的类进行解压缩操作以及...

    unzip jar包

    2. **Apache Commons IO**:这个库(对应`commons-io-2.4.jar`)则提供了许多基本的I/O操作功能,如文件复制、移动、删除,以及读写流等。在解压过程中,Apache Commons IO库可以用来读取和写入文件,处理输入和输出...

    maven 过滤文件夹打包

    在打包项目时,我们需要确保正确的配置文件被包含进最终的部署包中。 Maven的`maven-resources-plugin`插件提供了资源过滤功能,它允许我们在打包过程中根据构建目标(例如`package`命令)动态替换或选择性地包含...

    JVM调优篇.pdf

    注意这里不一定非得要从一个Class文件获取,这里既可以从ZIP包中读取(比如从jar包和war包中读取),也可以在运行时计算生成(动态代理),也可以由其他文件生成(比如将JSP文件转换成对应的Class类)。 验证 验证...

    apacheZIP打包工具

    6. **解压操作**:除了打包,Apache ZIP工具还支持解压功能,可以读取ZIP文件并将内容解压到指定的目录下。这在部署应用、恢复备份或者处理用户上传的压缩文件时非常有用。 7. **命令行工具**:除了编程接口,...

    解压缩工具类

    在Java中,处理压缩文件一般会用到Java的内置API,如`java.util.zip`包中的`ZipInputStream`和`ZipEntry`等类。这些类提供了读取和解压ZIP文件的基本功能。然而,这些API使用起来可能相对繁琐,因此开发者往往会创建...

    Tomcat启动顺序

    此外,对于每个Web应用程序,Tomcat还会执行Servlet的加载和初始化,包括读取`web.xml`部署描述符,实例化Servlet,并调用`init()`方法。 总结来说,Tomcat的启动顺序是一个自底向上,从核心到应用的过程,依次加载...

    solr基本安装

    - 将解压后的Solr包中的`example/solr`目录(包含所有子文件和子目录)完整地复制到`tomcat/webapps/solr`目录下。 6. **重启Tomcat并验证** - 重新启动Tomcat服务器。 - 打开浏览器访问`...

    jar包和测试空项目

    在部署过程中,将jar包和整个项目结构打包成war文件,然后通过管理工具(如manager.xml)上传到tomcat的webapps目录,或者通过脚本直接拷贝到相应位置。启动tomcat后,应用会被自动部署并可供访问。 总结来说,...

    spring boot 学习demo

    在Spring Boot中,开发者可以选择内嵌的Tomcat、Jetty或Undertow作为Web服务器,无需额外的部署步骤,应用程序可以直接运行在JAR或WAR包中。 4. **Actuator** Spring Boot Actuator 提供了一套丰富的监控和管理...

    Maven 自定义Zip插件

    这通常包括读取配置参数,遍历文件系统,选择要包含的文件,并使用`java.util.zip`包中的类来创建Zip档案。 3. **生成插件元数据**:使用`maven-plugin-plugin`来生成Maven插件的元数据,这样Maven就能识别并执行你...

    RSA-JS加密,JAVA解密实例

    2. 读取并解析存储的私钥(可能需要从文件或数据库中获取)。 3. 创建一个`Cipher`实例,设置为RSA解密模式。 4. 使用私钥初始化`Cipher`。 5. 进行解密操作,得到原始明文数据。 在`eaf.war`这个文件中,很可能...

Global site tag (gtag.js) - Google Analytics