百度知道里看到这样一段对话,感觉挺好,收藏一下:
tomcat中多个应用共用jar的情况下,如何为每个应用配置log4j.properties
举报违规检举侵权投诉|2012-07-31 16:35 tjmljw | 分类:JAVA相关 | 浏览1785次
1.项目A中有一个log4j.properties(配置为把日志输出到以项目名称命名的文件夹中)
2.为了减轻tomcat负担,把项目A的WEB-INF/lib下的所有jar文件拷贝到tomcat下的lib中并修改catalina.properties对其加载
3.把项目A复制一份为项目B
4.然后把项目A和项目B同时发布在tomcat中(发布时删除了WEB-INF/lib)
访问项目A和项目B,发现两个应用的日志全部输出到了项目A的文件夹中。
顺便说一下,如果把项目需要的jar放在WEB-INF/lib中,则不会出现上述的问题。
在所有的jar文件都拷贝到tomcat/lib中的前提下,如何使得各个应用的log4j.properties生效呢??
目前知道的是,两个工程中的log4j.properties的确都被加载了,只是最后一个被加载的log4j.properties覆盖了前面加载的配置,也就是说只有最后被加载的生效了。
分享到:
举报违规检举侵权投诉| 2012-07-31 18:27 提问者采纳
这个问题可能是这样的,由于你的log4j的包被放在了公共的目录下,因此tomcat在加载的时候,只加载这一份log4j相关类,而这一份log4j类在初始化过程中会读取你的日志输出路径,由于这个类被加载了一份,因此它本身也只能加载一份配置的输出路径(后面加载的覆盖前面加载的)。
你以往将log4j放在每个项目下,tomcat会创建多个classloader来负责加载每个项目路径中的类,而不同的log4j类当然就可以分别加载到不同的log4j properties文件,实现每个项目的单独输出。
不知你们项目为何一定要将所有的jar都归集到一处,我觉得你们可以单独把log4j这个包分开在各个项目中来实现这个功能。
追问
我曾试着提取log4j到WEB-INF中,但是加载tomcat/lib中的某些类时会提示找不到log4j,我想是因为类加载器加载顺序的问题。
回答
tomcat的加载规则和普通的类加载双亲委派不同。它是自身层级的加载器先加载,加载不到再委托父加载器。你放在tomcat的lib文件夹里的会被common classloader加载,而放在项目文件夹中的会被webapp classloader加载。commmo classloader是webapp classloader的父加载器,因此commmo classloader在加载自己路径中的类时,如果碰到log4j加载不到,只会委托自己的父加载器,也就是Application classloader去加载,而不会委托webapp classloader去加载,自然也就无法加载到你项目Lib中的log4j,你尝试一下把你的项目lib
中和tomcat的lib中都放入log4j试试吧。
追问
项目lib中和tomcat的lib中都放入log4j后,因为不同的classloader,加载时会出错,(部分)异常如下:
log4j:ERROR "org.apache.log4j.RollingFileAppender" was loaded by [WebappClassLoader
context: /dasp-mts-gerb
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@d9ceea
].
还有没有其它办法呢?
回答
想不出什么好的办法了。。
如果log4j通过公有类加载器加载一份,那路径就只有一个。
如果log4j分别被项目私有的类加载器加载,但是其他包被公有类加载器加载,那么其他包就加载不到log4j,因为公有类加载器无法去委派子加载器去加载。
如果log4j被公有类加载器和项目的私有类加载器加载,又会引发冲突。。
这个问题本身就非常纠结啊,感觉你们把所有的包都归集到一处,又把日志分开打,还是有点不科学。。如果要把包全部作为公有的,日志估计也就只能作为公有让所有项目共享了。。
还看到网上有这种分享:
在tomcat 中新建一个shared/lib文件夹,拷贝所有的jar 进去,然后再catalina.properties 文件中增加配置
shared.loader=${catalina.base}/shared/lib,${catalina.base}/shared/lib/*.jar
相关推荐
在Java企业版(J2EE)开发中,为了构建可扩展、健壮且跨平台的Web应用程序,开发者通常需要依赖一系列的库文件,这些文件主要包含在J2EE的公用jar包中。J2EE_5_Libraries这个压缩包正是为满足这样的需求而提供的,它...
它们之间共用的“公用JAR2”文件,很可能是一个包含了一系列公共库和组件的Java档案(JAR)文件,用于这些系统之间的功能共享和代码重用。 首先,我们来深入了解一下JAR文件。JAR(Java Archive)是Java平台特有的...
在具体项目开发中,这些公用JAR文件通常会被添加到项目的类路径中,使得各个系统在运行时能够正确加载和使用这些共享的代码资源。为了确保系统间的兼容性和版本一致性,开发者需要谨慎选择和管理这些依赖库,避免...
在IT行业中,Web服务器是构建和提供Web应用的关键组件,其中IIS(Internet Information Services)是微软提供的一个全面的Web服务器解决方案,而Tomcat则是Apache软件基金会开发的Java Servlet和JavaServer Pages...
7. **Tomcat服务器**:一个流行的开源Java应用服务器,常用于部署和运行Java Web应用。 8. **Eclipse集成开发环境**:Java开发者的常用工具,支持直接导入项目并进行调试,也可以通过插件与Tomcat进行集成,方便...
常用数据库连接,常用方法,可以对数据进行处理
"后面还有公用的jar"表明这个系统可能依赖于一些公共的Java库文件(.jar),这些文件通常包含了预编译的Java类,为多个应用程序提供共享功能。 【描述】:“宾馆管理系统。后面还有公用的jar 宾馆管理系统。后面...
在IT行业中,jar(Java Archive)包是一种广泛使用的文件格式,主要用于封装Java类库,使得开发者可以方便地分发和使用这些库。"项目公共jar包"标题表明这是一个专为项目设计的,包含了多个公共功能模块的Java类库...
"封装各种数据库操作JAR"这个标题意味着我们有一个Java Archive (JAR) 文件,它提供了一种通用的方式来与多种不同的数据库系统进行交互,包括SQL Server 2000和2005、Oracle 9i和10g、Access、DB2、MySQL、XML以及...
标题中的"IIS"和"Tomcat公用80"指的是在Windows服务器环境中,使用IIS(Internet Information Services)作为前端Web服务器,并与Tomcat(一个流行的Java应用服务器)结合,通过共享端口80来实现HTTP服务。...
`jfxrt.jar`是JavaFX运行时库的一个重要组成部分,通常包含在Java开发工具包(JDK)中,但有时可能需要单独下载以满足特定项目需求。 在Java 8之前,`jfxrt.jar`是Oracle JDK的一部分,确保开发者在安装JDK后即可...
Apache Tomcat是一个开源的软件应用服务器,主要用于部署和运行Java Servlet和JavaServer Pages(JSP)应用程序。在本文中,我们将深入探讨Tomcat的工作原理、如何安装与管理以及与网页代码的关系。 首先,Apache ...
Servlet生命周期包括加载、实例化、初始化、服务和销毁等阶段,其中初始化和服务阶段是处理请求的核心环节。 Apache Commons FileUpload库是Apache软件基金会的一个开源项目,它为Java提供了强大的文件上传功能。这...
在Tomcat中,Web应用程序通常以WAR文件的形式存在,类似于传统的Java应用中的JAR文件。WAR文件是一个包含了多种文件(如HTML、CSS、JavaScript、图片以及Servlet和JSP文件等)的压缩包,它使得Web应用程序可以方便地...
因此,需要设置两个 Tomcat 使用公用的 share 文件,以便实现文件共享。在 nginx 配置中,需要添加一个 location 块,以便将 share 文件定位到一个固定的 share 地址。 六、测试和部署 在配置完成后,需要测试 ...
Base64最好最全的jar包,支持字节数组 字符串String 互转。
公用对话框是Windows操作系统中的一种标准用户界面组件,它允许应用程序与用户进行特定类型的交互,如打开文件、保存文件、打印、颜色选择、字体选择等。这些预定义的对话框可以方便开发者快速集成到自己的应用中,...
WebSocket是一种在客户端和服务器之间建立长连接的协议,它提供了双向通信的能力,使得服务器可以主动向客户端推送数据,而不仅仅是响应客户端的请求。在Java环境中,实现WebSocket功能通常需要依赖特定的库,如...
ibatis的公用jar, ibatis被google收工后改名为mybatis, 资源jar是mybatis-3.1.0.jar, 请看清自己是否需要再下载.